“|”按位或运算符,优先级12级,如0x01|0xf0运算结果为0xf1。
“||”逻辑或运算符,也可以称之为条件或,优先级14级,如0x01||0xf0运算结果为True。
“==”等于运算符;“!=”不等于运算符。优先级9级。
=、+=、-=、*=、/=、%=、&=、^=、|=、=赋值运算符。优先级16级。
C语言的运算符主要用于构成表达式,同一个符号在不同的表达式中,其作用并不一致。下面按计算的优先顺序,分别说明不同作用的表达式。需要特别指出,在C语言标准中,并没有结合性的说法。[1]
相同优先级运算符,从左至右依次运算。注意后缀运算优先级高于前缀。因此++i++应解释为++(i++)。
而与或非的运算优先级都不一样,因此a&&b||b&&c解释为(a&&b)||(b&&c)
合理使用优先级可以极大简化表达式。
基本表达式1级
基本表达式(Primaryexpressions),主要是用于运算符之间,做为运算数。
标识,常量,字符串文字量,优先级提升表达式最优先执行。
优先级提升表达式是指圆括号包围的表达式,如“(expression)”
后缀表达式2极
postfix-expression[expression],数组下标运算。
postfix-expression(argument-expression-list),函数调用,括号内的参数可选。
postfix-expression.identifier,成员访问,
postfix-expression->identifier,成员访问,->号之前应为指针。
postfix-expression++,后缀自增
postfix-expression--,后缀自减
(type-name){initializer-list}
(type-name){initializer-list,}复合初始化,C99后新增。
单目/一元运算3级
++unary-expression前缀自增
--unary-expression前缀自减
unary-operatorcast-expression单目转型表式式,包括取地址&,提领*,正号+,负号-位反~逻辑否!。
sizeofunary-expression求类型长度,对表达式求类型长度
sizeof(type-name)求类型长度
强制类型表达式4级
(type-name)cast-expression,强制表达式成为type-name指定的类型。
乘法表达式5级
“*”乘法运算符;“/”除法运算符;“%”取余运算符。
加法运算符6级
“+”加法运算符;“-”减法运算符。
移位运算符7级
右移运算符。
关系运算符8级
=关系运算符。
相等运算符9级
“==”等于运算符;“!=”不等于运算符。
位与运算符10级
“&”按位与运算符
位异或运算符11级
“∧”按位异或运算符(BitwiseexclusiveORoperator)。
位或运算符12级
“|”按位或运算符(BitwiseinclusiveORoperator)。
逻辑与运算符13级
“&&”逻辑与运算符。
逻辑或运算符14级
“||”逻辑或运算符。
三元条件运算符15级
?:条件运算符。
赋值运算符16级
=、+=、-=、*=、/=、%=、&=、^=、|=、=赋值运算符。
逗号运算符17级
“,”逗号运算符。
[pre]C语言中,逗号(,)也可以是运算符,称为逗号运算符(CommaOperator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:
子表达式1,子表达式2,...,子表达式n
例如:
a+b,c=b,c++
逗号运算符的优先级是所有运算符中级别最低的,通常配合for循环使用。逗号表达式最右边的子表达式的值即为逗号表达式的值。上例中,c++的值(c自增之前的值)即为该表达式的值。
逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算。因此,上例中,c得到b的值后,才进行自增运算。