C语言运算符优先级(大全)

C语言运算符优先级(大全)

?按照运算符的操作对象(变量或常量)的个数分为三类: 单目运算符双目运算符三目运算符

?注意:当优先级相同时,按结合方向来进行计算

C语言运算符优先级(大全)

1.(后缀运算符)

运算符 名称
[] 数组下标
() 圆括号
. 成员选择
-> 成员选择

?结合方向从左到右

“.” 和 "->"多用在结构体(引用类,共用体)选择成员时使用。

直接访问结构的成员时用点运算符,通过指针访问结构的成员用箭头运算符。

struct student
{
char name[20];
int age;
}A

对于A而言,如果A是个指针,则使用箭头运算符,(A->name)反之(A.name)。

2.(一元运算符)

运算符 名称
- 负号
++ 自增
自减
* 取值(指针)
& 取地址
逻辑非
(类型) 强制转换类型
sizeof 求长度
~ 按位取反

? 结合方向从右到左

注意:后置++/–的优先级大于前置++/–

~:按位取反是对二进制位补码取反

快捷算法:

X取反结果:~X=-(X+1)

对正数5按位取反,~5
十进制 5
二进制原码 00000101
二进制补码 00000101(正数原码=补码)
按位取反: 11111010(补码)
二进制原码 10000110
十进制 -6

对负数5按位取反,~-5
十进制 -5
二进制原码 10000101
二进制补码 11111011(负数补码=反码+1)
按位取反: 00000100(补码)
二进制原码 00000100(正数原码=补码)
十进制 4

3.(乘除运算符)

运算符 名称
/
*
% 取余

?结合方向从左到右

4.(加减运算符)

运算符 名称
+
-

? 结合方向从左到右

5.(位移运算符)

运算符 名称
<< 左移
>> 右移

? 结合方向从左到右

6.(关系运算符)

运算符 名称
> 大于
>= 大于等于
< 小于
<= 小于等于

?结合方向从左到右

7.(相等运算符)

运算符 名称
== 等于
!= 不等于

?结合方向从左到右

8.(位运算符)

运算符 名称
& 按位与

?结合方向从左到右

二进制位,两个均为1的取1,剩下的取0

9.(位运算符)

运算符 名称
^ 按位异或

?结合方向从左到右

二进制位,相同的为0,不同的为1

10.(位运算符)

运算符 名称
| 按位或

?结合方向从左到右

二进制位,有含1的取1,全为0的取0

11.(逻辑运算符)

运算符 名称
&& 逻辑与
(采用短路运算):如果前面一个运算式返回为0,则后面的运算式不运算

?结合方向从左到右

12.(逻辑运算符)

运算符 名称
|| 逻辑或
(采用短路运算):如果前面一个运算式返回为1,则后面的运算式不运算

?结合方向从左到右

13.(条件运算符)

运算符 名称
?: 条件运算符

? 结合方向从右到左

14.(赋值运算符)

运算符 名称
= 赋值
/= 除后赋值
*= 乘后赋值
%= 取模后赋值
+= 加后赋值
-= 减后赋值
<<= 左移后赋值
>>= 右移后赋值
&= 按位与后赋值
^= 按位异或后赋值
|= 按位或后赋值

? 结合方向从右到左

15.(逗号运算符)

运算符 名称
逗号表达式

?结合方向从左到右

o = (a = 2 * 6, a * 3, a + 5);
//o=17,先计算括号内的表达式,将结果赋值给o
//(a*3不作为赋值语句(可以忽略),逗号表达式的结果o与最后一个表达式的结果有关系)
o = a = 2 * 6, a * 3, a + 5;
//o=12,直接将第一个表达式结果赋值给o