菜鸟笔记
提升您的技术认知

C语言运算符优先级

阅读 : 88

运算符按照优先级大小由上向下排列,在同一行的运算符具有相同优先级。第二行是所有的一元运算符。
 

运算符 解释 结合方式
() [] -> . 括号(函数等),数组,两种结构成员访问 由左向右
! ~ ++ -- + -

* & (类型) sizeof

否定,按位否定,增量,减量,正负号,

间接,取地址,类型转换,求大小

由右向左
* / % 乘,除,取模 由左向右
+ - 加,减 由左向右
<< >> 左移,右移 由左向右
< <= >= > 小于,小于等于,大于等于,大于 由左向右
== != 等于,不等于 由左向右
& 按位与 由左向右
^ 按位异或 由左向右
| 按位或 由左向右
&& 逻辑与 由左向右
|| 逻辑或 由左向右
? : 条件 由右向左
= += -= *= /=

&= ^= |= <<= >>=

各种赋值 由右向左
, 逗号(顺序) 由左向右

由上表也可以看出一定规律,括号优先级最高,单目运算符(如!)高于又目、多目运算符
2、本人不是反对记优先级,但强烈建议不论什么表达式,均加括号,比如要实现
b = a * 2 + 1,可以由很多种方法实现,看以下两种方法实现

b = a * 2 + 1;
或者
b = a<<1 + 1;  // 错
本来每二种方法也可以实现,但是结果是错误的,因为运算符+比移位操作<<的优先级要高,结果就成了 b = a<<2;
加括号就可以避免由于优先记记忆不准确造成错误
b = (a<<1) + 1; // OK