c_calculate
C语言中的运算符优先级决定了在执行一个包含多个运算符的表达式时,各个运算符的计算顺序。优先级高的运算符会先于优先级低的运算符被执行。
这是一个C语言运算符的优先级和结合性(associativity)的完整表格,从上到下优先级依次降低。
👑 C语言运算符优先级总表
| 优先级 (高到低) | 运算符 | 描述 | 结合性 |
|---|---|---|---|
| 1 (最高) | () |
函数调用 | 从左到右 |
[] |
数组下标 | ||
. |
结构体成员访问 (通过对象) | ||
-> |
结构体成员访问 (通过指针) | ||
++ |
后缀自增 | ||
-- |
后缀自减 | ||
| 2 | ++ |
前缀自增 | 从右到左 |
-- |
前缀自减 | ||
+ |
一元正号 | ||
- |
一元负号 | ||
! |
逻辑非 (NOT) | ||
~ |
按位取反 | ||
(type) |
类型强制转换 | ||
* |
指针解引用 | ||
& |
取地址 | ||
sizeof |
计算大小 | ||
| 3 | * |
乘法 | 从左到右 |
/ |
除法 | ||
% |
取模 (取余) | ||
| 4 | + |
加法 | 从左到右 |
- |
减法 | ||
| 5 | << |
按位左移 | 从左到右 |
>> |
按位右移 | ||
| 6 | < |
小于 | 从左到右 |
<= |
小于等于 | ||
> |
大于 | ||
>= |
大于等于 | ||
| 7 | == |
等于 | 从左到右 |
!= |
不等于 | ||
| 8 | & |
按位与 (AND) | 从左到右 |
| 9 | ^ |
按位异或 (XOR) | 从左到右 |
| 10 | ` | ` | 按位或 (OR) |
| 11 | && |
逻辑与 (AND) | 从左到右 |
| 12 | ` | ` | |
| 13 | ?: |
条件运算符 (三元运算符) | 从右到左 |
| 14 | = |
简单赋值 | 从右到左 |
+= -= |
加法/减法赋值 | ||
*= /= %= |
乘法/除法/取模赋值 | ||
<<= >>= |
按位左移/右移赋值 | ||
&= ^= ` |
=` | 按位与/异或/或赋值 | |
| 15 (最低) | , |
逗号运算符 | 从左到右 |
💡 关键概念解释
1. 优先级 (Precedence)
- 什么是优先级? 它决定了哪个运算符先“绑定”其操作数。
- 示例: 在
a = b + c * d;中:*(乘法) 的优先级高于+(加法)。+(加法) 的优先级高于=(赋值)。- 因此,计算顺序是:先算
c * d,然后将结果与b相加,最后将总和赋值给a。
2. 结合性 (Associativity)
- 什么是结合性? 当一个表达式中有多个相同优先级的运算符时,结合性决定了它们的执行顺序。
- 从左到右 (Left-to-right):运算符从左侧开始依次执行。
- 从右到左 (Right-to-left):运算符从右侧开始依次执行。
- 示例 (从左到右): 在
a - b + c;中:+和-优先级相同,结合性是“从左到右”。- 所以它等价于
(a - b) + c;。
- 示例 (从右到左): 在
a = b = c;中:=(赋值) 的结合性是“从右到左”。- 所以它等价于
a = (b = c);。首先将c赋值给b,然后再将b的值(也就是c的值)赋值给a。
🔔 最佳实践:
即使你记住了所有优先级,也强烈建议使用圆括号
()来明确指定你想要的计算顺序。这不仅可以防止因记错优先级而出错,还能让你的代码更清晰、更易于阅读。例如,
a = (b + c) * d;就比a = b + c * d;要清晰得多(尽管在这个例子中后者也符合预期)。