以下是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语言的运算符优先级对于编写清晰、正确的代码至关重要。