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