C语言操作符优先级
优先级 |
运算符 |
含 义 |
要求运算 对象的个数 |
结合方向 |
1 |
() [] -> . |
圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 |
|
自左至右 |
2 |
! |
逻辑非运算符 |
1 (单目运算符) |
自右至左 |
~ |
按位取反运算符 | |||
++ |
自增运算符 | |||
-- |
自减运算符 | |||
- |
负号运算符 | |||
(类型) |
类型转换运算符 | |||
* |
指针运算符 | |||
& |
地址与运算符 | |||
sizeof |
长度运算符 | |||
3 |
* / % |
乘法运算符 除法运算符 求余运算符 |
2 (双目运算符) |
自左至右 |
4 |
+ - |
加法运算符 减法运算符 |
2 (双目运算符) |
自左至右 |
5 |
<< >> |
左移运算符 右移运算符 |
2 (双目运算符) |
|
6 |
< <= > >= |
关系运算符 |
2 (双目运算符) |
自左至右 |
7 |
== != |
等于运算符 不等于运算符 |
2 (双目运算符) |
自左至右 |
8 |
& |
按位与运算符 |
2 (双目运算符) |
自左至右 |
9 |
^ |
按位异或运算符 |
2 (双目运算符) |
自左至右 |
10 |
| |
按位或运算符 |
2 (双目运算符) |
自左至右 |
11 |
&& |
逻辑与运算符 |
2 (双目运算符) |
自左至右 |
12 |
|| |
逻辑或运算符 |
2 (双目运算符) |
自左至右 |
13 |
? : |
条件运算符 |
3 (三目运算) |
自右至左 |
14 |
= += -= *= /= %= >>= <<= &= ^= |= |
赋值运算符 |
2 |
自右至左 |
15 |
, |
逗号运算符 |
|
自左至右 |
完全记下操作符优先级可能有困难,所以这里列写出大有歧义的操作符组合。
优先级问题 表达式 实际结果
1、.的优先级高于* *p.f 先对p取偏移,然后再进行解除引用操作*(p.f)
2、[ ]高于* int *ap[] 不是一个指向数组的指针int (*ap)[],而是一个指针数组int*(ap[])
3、()高于* int *fp() fp不是函数指针,而是一个函数返回int*
4、==和!=高于位操作符 (val & mask != 0) 先计算!=,即val & (mask != 0)
5、==和!=高于赋值运算符 c = getchar() != EOF 先计算!=,即c = (getchar() != EOF)
6、算术运算高于移位运算 msb << 4+1 这里是移5位
7、逗号运算符在所有运算符中优先级最低
8、自增(++)自减(--)高于* *p++ 是指针后移之后取内容