运算符+ - * / % > < >= <= == != & | ^
以及各种复合赋值运算符要求两边的操作数类型一致,条件运算符?:
要求后两个操作数类型一致,这些运算符在计算之前都需要做Usual Arithmetic Conversion。
下面按优先级从高到低的顺序总结一下C语言的运算符,每一条所列的各运算符具有相同的优先级,对于同一优先级的多个运算符按什么顺序计算也有说明,双目运算符就简单地用“左结合”或“右结合”来说明了。
[]
、函数调用()
、结构体取成员.
、指向结构体的指针取成员->
、后缀自增++
、后缀自减--
。如果一个操作数后面有多个后缀运算符,按照离操作数从近到远的顺序(也就是从左到右)依次计算,比如a.name++
,先算a.name
,再++
,这里的.name
应该看成a
的一个后缀,而不是把.
看成双目运算符。++
、前缀自减--
、sizeof
、类型转换()
、取地址运算&
、指针间接寻址*
、正号+
、负号-
、按位取反~
、逻辑非!
。如果一个操作数前面有多个前缀,按照离操作数从近到远的顺序(也就是从右到左)依次计算,比如!~a
,先算~a
,再求!
。*
、除/
、模%
运算符。这三个运算符是左结合的。+
、减-
运算符。左结合。<<
和>>
。左结合。< > <= >=
。左结合。==
和!=
。左结合。&
。左结合。^
。左结合。|
。左结合。&&
。左结合。||
。左结合。:?
。注意:例如a ? b : c ? d : e
是看成(a ? b : c) ? d : e
还是a ? b : (c ? d : e)
呢? C语言规定是后者。=
和各种复合赋值*= /= %= += -= <<= >>= &= ^= |=
。在双目运算符中只有赋值和复合赋值是右结合的。