6.3 运算符优先级与联合性
如果你考虑这样一个表达式:3+2*5,先计算*和先计算+所得到的结果是不同的.
为了消除表达式的这种歧义,运算符被分配了不同的优先级别.
这种情况下,*的优先级要高于+的优先级,所以将先计算*再计算+,所以3+2*5的结果是13.
如果两个运算符同级,则处理方式从左到右,除了单目运算符和赋值运算符,他们联合方式从右到左.
例如,*和/是同级的,所以5.0*5/6等于25.0/6等于4.166667.
另一方面,5/6*5.0等于0*5.0等于0.0.
与此相反,单目运算符从右到左计算,-!0也就是-(!0),也就是-1.
如果表达式的某个部分用使用了括号"()",则此部分将最先运算.
例如,表达式(3+2)*5,首先计算+,然后计算*,结果是25.
如果嵌套多个括号,则最里层的括号首先运算.
运算符优先级基本上和C一样.
完整的运算符优先级列表,从高到底,如下:
运算符 | 优先级 |
---|---|
! ~ - (单目运算符) | 最高级 |
** | ? |
* / % | ? |
+ - | ? |
> >= < <= | ? |
= != 区间运算符 | ? |
:= | ? |
& | ? |
^ | ? |
| | ? |
&& | ? |
^^ | ? |
|| | 最低级 |
鼓励程序员使用括号使表达式在必要时保持清晰(可读性).
否则,由于运算符优先级细微的错误而产生的bug几乎很难被查明.