我参考下面的链接,整理了这张 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 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注