以下是C语言中运算符优先级的,以及对每个运算符的详细解释:
优先级 | 运算符类别 | 运算符 | 描述 |
---|---|---|---|
1 | 后缀 | () 函数调用 ( 数组下标 ) | 函数调用、数组元素访问 |
. 结构体成员访问 -> 结构体指针成员访问 | 访问结构体的成员 | ||
++ 后缀自增 -- 后缀自减 | 自增或自减操作,发生在变量使用之后 | ||
一元 | + 正号 - 负号 ! 逻辑非 ~ 按位取反 (type) 强制类型转换 * 指针解引用 & 取地址 sizeof 大小运算符 _Alignof 对齐运算符 _Generic 泛型选择符 _Static_assert 静态断言 | 单目运算符,对单个操作数进行操作 | |
2 | 乘除 | * 乘法 / 除法 % 取模 | 乘法、除法和取模运算 |
3 | 加减 | + 加法 - 减法 | 加法和减法运算 |
4 | 移位 | << 左移 >> 右移 | 将二进制位向左或向右移动指定的位数 |
5 | 关系 | < 小于 <= 小于等于 > 大于 >= 大于等于 | 比较运算,用于判断大小关系 |
6 | 相等 | == 等于 != 不等于 | 比较两个值是否相等或不等 |
7 | 按位与 | & 按位与 | 对两个整数的二进制表示进行逐位与操作 |
8 | 按位异或 | ^ 按位异或 | 对两个整数的二进制表示进行逐位异或操作 |
9 | 按位或 | ` | ` 按位或 |
10 | 逻辑与 | && 逻辑与 | 逻辑与操作,当两个操作数都为真时返回真 |
11 | 逻辑或 | ` | |
12 | 条件 | ?: 条件运算符 | 三元条件运算符,根据条件表达式的结果选择两个值中的一个 |
13 | 赋值 | = 赋值 += 加法赋值 -= 减法赋值 *= 乘法赋值 /= 除法赋值 %= 取模赋值 <<= 左移赋值 >>= 右移赋值 &= 按位与赋值 ^= 按位异或赋值 ` | =` 按位或赋值 |
14 | 逗号 | , 逗号 | 用于分隔表达式,整个逗号表达式的结果是最右边表达式的值 |
注意:在C语言中,大多数运算符是从左到右进行求值的,但有少数运算符是从右到左进行求值的,例如赋值运算符(=
, +=
, -=
, 等)和逗号运算符(,
)。
示例:
int a = 5, b = 10, c;
c = a * (b + 1); // 正确的计算顺序:b + 1 先计算,然后 a 与结果相乘
c = a * b + 1; // 如果没有括号,将先执行 a * b,然后 b + 1,最后将两个结果相加
在使用复杂表达式时,如果不确定运算的顺序,可以使用括号来明确指定优先级,以避免潜在的错误。例如:
int result = (a + b) * c; // 使用括号确保先执行 a + b
掌握C语言的运算符优先级对于编写清晰、正确的代码至关重要。