共44个运算符,以下按优先级排序,从上往下优先级降低,同级相等,第一个括号里的表示结合性,第二个括号里的表示个数。
- 初等运算符(左到右)(4):
( )[ ].->(连接指针变量与结构体成员) - 单目运算符(右到左)(9):
!~(位反)++---*&sizeof( )(用于强制类型转换) - 算数运算符(左到右)(3):
*/% - 算数运算符(左到右)(2):
+- - 位运算符(左到右)(2):
<<(位左移)>>(位右移) - 关系运算符(左到右)(4):
>>=<<= - 关系运算符(左到右)(2):
==!= - 位运算符(左到右)(1):
&(位与) - 位运算符(左到右)(1):
^(位异或) - 位运算符(左到右)(1):
|(位或) - 逻辑运算符(左到右)(1):
&& - 逻辑运算符(左到右)(1):
|| - 条件运算符(右到左)(1):
?:(条件求值) - 赋值运算符(右到左)(11):
=+=-=*=%=>>=<<=&=^=|=/= - 逗号运算符(左到右)(1):
,(顺序求值)
结合性
C标准中没有给出结合性的标准说明,不过一个比较正确的理解是『在一个表达式中,如果多个符号的优先级相同,那就按结合性选择运算顺序』,如a=b=c,=是从右下向左的结合性,所以先算后面的=再算前面的。
求值顺序
和求值顺序有关的只有以下四个运算符
&&先算左边,左边为True时算右边,为False则忽略右边||先算左边,左边为False时算右边,为Ture则忽略右边,先算左边,算完后扔掉值再算右边?:先算最前面,结果为True就算中间,False就算后面
++
++前缀先算,后缀如果在混合运算中,先忽略掉,即直接算混合运算,混合运算算完后再进行单独的后缀运算,++必须紧跟值而不能跟表达式。