×
研发技术 > 嵌入式 > 详情

高效的C编程之:布尔表达式

发布时间:2024-07-02 发布时间:
|

  14.4  布尔表达式

  14.4.1  范围检测

  通常,布尔表达式被用来检测某个数值是否在特定的范围内。例如,在图形窗口处理程序中,常使用布尔表达式判断屏幕中一个点是否在当前活动窗口范围内。

  下面的程序使用结构体定义点坐标并计算坐标的当前位置。

  bool PointInRect1(Point p, Rectangle *r)

  {  return (p.x >= r->xmin && p.x < r->xmax &&

  p.y >= r->ymin && p.y < r->ymax);

  }

  上面的功能函数,被编译为下面的指令序列。

  PointInRect1

  LDR      a4,[a3,#0]

  CMP      a1,a4

  BLT      |L000034.J5.PointInRect1|

  LDR      a4,[a3,#4]

  CMP      a4,a1

  BLE      |L000034.J5.PointInRect1|

  LDR      a1,[a3,#8]

  CMP      a2,a1

  BLT      |L000034.J5.PointInRect1|

  LDR      a1,[a3,#&c]!

  CMP      a2,a1

  MOVLT    a1,#1

  MOVLT    pc,lr

  |L000034.J5.PointInRect1|

  MOV      a1,#0

  MOV      pc,lr

  但上面的代码并不是最精简的。编译器对(x >= min && x < max)形式的布尔表达式的处理过程比较复杂。它将以(unsigned)(x-min) < (max-min)形式实现布尔操作。所有对于上面范围判断的代码,建议将函数写成如下形式。

  bool PointInRect2(Point p, Rectangle *r)

  {  return ((unsigned) (p.x - r->xmin) < r->xmax &&

  (unsigned) (p.y - r->ymin) < r->ymax);

  }

  这样编译出的汇编指令序列如下所示。

  PointInRect2

  LDR      a4,[a3,#0]

  SUB      a1,a1,a4

  LDR      a4,[a3,#4]

  CMP      a1,a4

  LDRCC    a1,[a3,#8]

  SUBCC    a1,a2,a1

  LDRCC    a2,[a3,#&c]!

  CMPCC    a1,a2

  MOVCS    a1,#0

  MOVCC    a1,#1

  MOV      pc,lr


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
嵌入式linux系统环境下USB设备的驱动实现