运算符的结合性和优先级
优先级 | 运算符 | 描述 | 结合性 |
---|---|---|---|
1 | () [] -> . |
函数调用、数组下标、结构体 / 联合体成员通过指针访问、结构体 / 联合体成员访问 | 从左到右 |
2 | ! ~ ++ (前缀)-- (前缀)+ (一元)- (一元)* (间接寻址)& (取地址)sizeof (type) |
逻辑非、按位取反、前缀自增、前缀自减、一元正号、一元负号、间接寻址、取地址、获取操作数的大小、类型转换 | 从右到左 |
3 | * / % |
乘法、除法、取模 | 从左到右 |
4 | + - |
加法、减法 | 从左到右 |
5 | << >> |
左移、右移 | 从左到右 |
6 | < <= > >= |
小于、小于等于、大于、大于等于 | 从左到右 |
7 | == != |
相等、不相等 | 从左到右 |
8 | & |
按位与 | 从左到右 |
9 | ^ |
按位异或 | 从左到右 |
10 | <code>|</code> | 按位或 | 从左到右 |
11 | && |
逻辑与 | 从左到右 |
12 | <code>||</code> | 逻辑或 | 从左到右 |
13 | ? : |
条件运算符(三元运算符) | 从右到左 |
14 | = += -= *= /= %= <<= >>= &= ^= <code>|=</code> |
赋值、复合赋值运算符 | 从右到左 |
15 | , |
逗号运算符 | 从左到右 |
上手demo
#include <stdio.h>
int main() {
int a = 2, b = 3, c = 4;
// 乘法优先级高于加法
int result1 = a + b * c; // 先计算 b * c,结果为 12,再加上 a,最终结果为 14
printf("result1: %d\n", result1);
// 使用括号改变优先级
int result2 = (a + b) * c; // 先计算 a + b,结果为 5,再乘以 c,最终结果为 20
printf("result2: %d\n", result2);
// 后缀自增和前缀自增
int d = 5;
int result3 = d++ + ++d; // 先使用 d 的值 5 进行计算,然后 d 自增,再将自增后的 d(此时为 7)加 1,最终结果为 12
printf("result3: %d\n", result3);
// 逻辑运算符
int result4 = (a < b) && (b < c); // 先计算 a < b 和 b < c,结果都为真,最终结果为 1
printf("result4: %d\n", result4);
// 条件运算符
int result5 = (a > b)? a : b; // a 不大于 b,所以结果为 b 的值,即 3
printf("result5: %d\n", result5);
// 复合赋值运算符
a += b; // 等价于 a =