运算符按照优先级大小由上向下排列,在同一行的运算符具有相同优先级。第二行是所有的一元运算符。
运算符 | 解释 | 结合方式 |
() [] -> . | 括号(函数等),数组,两种结构成员访问 | 由左向右 |
! ~ -- -
* & (类型) sizeof |
否定,按位否定,增量,减量,正负号,
间接,取地址,类型转换,求大小 |
由右向左 |
* / % | 乘,除,取模 | 由左向右 |
- | 加,减 | 由左向右 |
<< >> | 左移,右移 | 由左向右 |
< <= >= > | 小于,小于等于,大于等于,大于 | 由左向右 |
== != | 等于,不等于 | 由左向右 |
& | 按位与 | 由左向右 |
^ | 按位异或 | 由左向右 |
| | 按位或 | 由左向右 |
&& | 逻辑与 | 由左向右 |
|| | 逻辑或 | 由左向右 |
? : | 条件 | 由右向左 |
= = -= *= /=
&= ^= |= <<= >>= |
各种赋值 | 由右向左 |
, | 逗号(顺序) | 由左向右 |
由上表也可以看出一定规律,括号优先级最高,单目运算符(如!)高于又目、多目运算符
2、本人不是反对记优先级,但强烈建议不论什么表达式,均加括号,比如要实现
b = a * 2 1,可以由很多种方法实现,看以下两种方法实现
b = a * 2 1;
或者
b = a<<1 1; // 错
本来每二种方法也可以实现,但是结果是错误的,因为运算符 比移位操作<<的优先级要高,结果就成了 b = a<<2;
加括号就可以避免由于优先记记忆不准确造成错误
b = (a<<1) 1; // ok