3.6.9. 运算符优先级

汇编程序中包括一个扩展的运算符集,这些运算符用在表达式中。 许多运算符与 C 语言等高级语言中对应的运算符类似(请参阅一元运算符二元运算符)。

在它们的求值中有着非常严格的优先顺序:

  1. 圆括号中的表达式应最先求值。

  2. 运算符根据优先顺序应用。

  3. 邻近的一元运算符从右向左求值。

  4. 优先级相同的二元运算符从左向右求值。

armasm 和 C 中的运算符优先级

汇编程序的优先顺序与 C 语言中的并不完全一致。

例如,在 armasm 中,(1 + 2 :SHR: 3)(1 + (2 :SHR: 3)) = 1 求值。 在 C 语言中等效的表达式按 ((1 + 2) >> 3) = 0 求值。

建议您使用括号使优先级更加明显。

如果您的代码包含与 C 中的解析不同的表达式,并且没有使用 --unsafe 选项,则 armasm 通常会发出警告:


A1466W: Operator precedence means that expression would evaluate differently in C

Table 3.4 显示了 armasm 中运算符的优先顺序,并与 C 中的相应顺序进行了比较(请参阅Table 3.5)。

在这些表中:

  • 优先级最高的运算符位于列表的顶端。

  • 优先级最高的运算符最先求值。

  • 优先级相同的运算符从左向右求值。

Table 3.4. armasm 中的运算符优先级 

armasm 中的优先级 等效的 C 运算符
一元运算符 一元运算符
* / :MOD: * / %
字符串处理运算符 不适用
:SHL: :SHR: :ROR: :ROL: << >>
+ - :AND: :OR: :EOR: + - & |
= > >= < <= /= <> == > >= < <= !=
:LAND: :LOR: :LEOR: && ||

Table 3.5. C 中的运算符优先级 

C 优先级
一元运算符
* / %
+ -(同二元运算符)
<< >>
< <= > >=
== !=
&
^
|
&&
||
Copyright © 2002-2007 ARM Limited. All rights reserved. ARM DUI 0204HC
Non-Confidential