博客 Miscellaneous C 语言运算符优先级与结合性
我参考下面的链接,整理了这张 C 运算符表,方便快速查阅。
运算符表
| 优先级 | 类别 | 运算符 | 结合性 |
|---|
1 | 一元后缀 | ++ --
后缀自增和自减,例如 var++;。 ()
函数调用,例如 func (param)。 []
数组下标,例如 x=X[1];。 .
结构体和联合体成员访问,例如 x=Param.x;。 ->
通过指针访问结构体和联合体成员,例如 x=this->x;。 (type){list}
复合字面量(C99),例如 int *p = (int[]){2, 4}; | 从左到右一元后缀运算符总是从左到右结合(a[1][2]++ 即 ((a[1])[2])++)。注意,成员访问运算符虽然和一元后缀运算符归为一组,结合性对它们同样有意义:a.b++ 解析为 (a.b)++,而不是 a.(b++)。 |
2 | 一元前缀 | ++ --
前缀自增和自减,例如 ++var;。 + -
一元正号和负号,例如 a=-b;。 ! ~
逻辑非和按位取反,例如 a=!b;。 (type)
类型转换,例如 float x = (float)y;。 *
间接访问(解引用),例如 float x = *(float *)&y;。 &
取地址,例如 float x = *(float *)&y;。 sizeof
求大小,例如 sizeof (int) * p 即 (sizeof(int)) * p。 | 从右到左一元前缀运算符总是从右到左结合(sizeof ++*p 即 sizeof(++(*p)))。 |
3 | 二元 | * / %
乘法、除法和取余,例如 x=a*b/c%d 即 x=((a*b)/c)%d。 | 从左到右 |
4 | 二元 | + -
加法和减法,例如 x=a+b-c 即 x=(a+b)-c。 | 从左到右 |
5 | 二元 | << >>
按位左移和右移,例如 x=a>>1<<1 即 x=(a>>1)<<1。 | 从左到右 |
6 | 二元 | < <=
分别为关系运算符 < 和 ≤。 > >=
分别为关系运算符 > 和 ≥。 | 从左到右 |
7 | 二元 | == !=
分别为关系运算 = 和 ≠。 | 从左到右 |
8 | 二元 | &
按位与。 | 从左到右 |
9 | 二元 | ^
按位异或。 | 从左到右 |
10 | 二元 | |
按位或。 | 从左到右 |
11 | 二元 | &&
逻辑与。 | 从左到右 |
12 | 二元 | ||
逻辑或,例如 x = a && b || c && d 即 x = (a&&b) || (c&&d)。 | 从左到右 |
13 | 三元 | ?:
三元条件运算。条件运算符中间(? 与 : 之间)的表达式按加了括号的方式解析:忽略它相对于 ?: 的优先级。 | 从右到左 |
14 | 赋值 | =
简单赋值。由于从右到左结合,表达式 a=b=c 解析为 a=(b=c),而不是 (a=b)=c。 += -=
加后赋值、减后赋值。 *= /= %=
乘后赋值、除后赋值、取余后赋值。 <<= >>=
按位左移后赋值、右移后赋值。 &= ^= |=
按位与、异或、或后赋值。 | 从右到左 |
15 | 逗号 | ,
逗号。 | 从左到右 |
参考
C 运算符优先级
0 条评论