详细表:
优先级 | 运算符及其运算符 | 结合规律 |
1 | [ ] , () ,.(结构体访问成员点方式) ,->(结构体访问成员箭头方式) ,后缀++ ,后缀-- | 从左向右 |
2 | 前缀++ 前缀-- sizeof *(指针解引用) &(取地址) ^ 正负号 减量 增量 ~(按位否定) ! | 从右向左 |
3 | 强制类型转换 | 从右向左 |
4 | *(乘) /(除) %(取余) | 从左向右 |
5 | + - (算术加减) | 从左向右 |
6 | << >> (位移位) | 从左向右 |
7 | < <= >= > (小于 小于等于 大于等于 大于) | 从左向右 |
8 | == != | 从左向右 |
9 | & (按位与) | 从左向右 |
10 | ^ (按位异或) | 从左向右 |
11 | | (按位或) | 从左向右 |
12 | && (逻辑与) | 从左向右 |
13 | || (逻辑或) | 从左向右 |
14 | ? :(三目运算 如:a?1:0) | 从左向右 |
15 | = *= /= %= += -= <<= >>= &= ^= |= (与赋值号相关的) | 从右向左 |
16 | , (逗号运算符) | 从右向左 |
粗略记忆 :
优先级排序为:
!(非) 高
算术运算符
关系运算符
&& 和 || (与 > 或)
赋值运算符 低
关于“优先级”的题目举例:
例题1:
main(){
int x,a=1,b=2,c=0;
x= --a||b&&++c;
printf("%d",x);
}
结果为
从上面我们可以分析:
由于 优先级 &&>|| , 所以 x= --a||b&&++c; 等价于 x= --a ||(b&&++c);
由于 括号优先级高,先计算右边, b&&++c
++c的 算术运算优先级高,所以 先计算++c, 然后 2&&1 值为真(就是1)
之后计算 --a|| 1
因为(算术运算符> || ) 左侧先计算 --a ,之后 0||1 得出最终答案 1.
例题2:
若a是int类型变量,表达式(a=5*5,a*2),a+6的 值是()多少? 答案是26
代码如下:
#include<stdio.h>
int main(){
int x,y,a;
x=((a=4*5,a*2),a+6);
y=(a=4*5,a*2),a+6;
printf("%d\t%d",x,y);
return 0;
}
结果为:
补充:
我们可以先把上面两个表达式简化成👇
例一:o = 表达式1,表达式2,表达式3;
因为逗号表达式是优先级最低的表达式,赋值表达式的优先级高,所以会把表达式1的值直接赋值给o
例二:o = (表达式1,表达式2,表达式3);
括号里中的先执行,逗号表达式是左结合性,所以会从左往右依次执行,最后再把表达式3的值赋值给o
之后,分析可得 (a=4*5,a*2),a+6
先计算a=4*5 使得a=20
再计算,a*2,(此时a=20) =40
所以(a=4*5,a*2) 整体的值 等于 40
再计算右侧a+6 =26
所以最终结果为 26。
PS:至于为什么y=40是因为逗号表达式 优先级 低于 赋值语句“=”,所以提前执行了 y=40操作.