12. 运算符优先级与结合性
C 语言的运算符有十五个优先级,优先级数值越小,优先级越高。当一个表达式有多个运算符时,高优先级的运算符先进行运算。对于相同的优先级的运算符,具体要看运算符的结合性来决定哪个运算符先计算。
C 语言运算符优先级表
优先级
运算符
说明
结合性
1
++ -- () [] . -> (type){list}后置自增/减、函数调用、数组下标、结构体(联合体)成员访问、结构体(联合体)指针成员访问、复合字面值
(C99)自左向右
2
++ -- + - ! ~ (type) * & sizeof _Alignof前置自增/减、正负号、逻辑非、按位取反、强制类型转换、解引用、取地址、求占用字节数、查询对齐
(C11)自右向左
3
* / %乘、除、取模(求余数)
自左向右
4
+ -加、减
自左向右
5
<< >>左移、右移
自左向右
6
< <= > >=关系运算符比较
自左向右
7
== !=关系运算符等于、不等于
自左向右
8
&按位与
自左向右
9
^按位异或
自左向右
10
|按位或
自左向右
11
&&逻辑与
自左向右
12
||逻辑或
自左向右
13
?:条件运算符(三元运算符)
自右向左
14
= += -= *= /= %= <<= >>= &= ^= \|=赋值运算符
自右向左
15
,逗号运算符
自左向右
对于上述优先级表比较复杂,在不确定的情况下可以使用 括号() 来提高表达式的优先级。因为括号的优先级最高。
在复杂的表达式中,可以使用括号嵌套的方式来提高运算符的计算顺序,最内侧的括号先进行进行计算,如:
int x = 2
int y;
y = (1 + (x << 1)) * 3;
练习:
请问如下程序中,变量 x、y、z 的值是多少?
int x = 1 + 2 / 3 * 4 - 5 + 6 * 7;
int y = 256 | 1 << 2;
int z = 5;
z *= z << 1;
printf("x:%d, y:%d, z:%d\n", x, y, z);