掌握 C# 运算符优先级与结合性:实战指南
掌握 C# 运算符优先级与结合性
本深度教程解释 C# 编译器如何通过运算符优先级和结合性规则来求值表达式。通过清晰的示例和参考表快速掌握核心概念。
C# 中的运算符优先级
运算符优先级决定了表达式中各部分的求值顺序。每个 C# 运算符都有固定的优先级,确保编译器以一致的方式处理表达式。
例如,乘法运算符 * 的优先级高于加法运算符 +。因此,在表达式
int x = 4 + 3 * 5;中,乘法会先执行,得到
x = 19。
如果加法优先于乘法,结果将是 35 —— 但 C# 遵循既定的优先级层级。
运算符优先级表
下表按优先级从高到低列出了运算符。
| 类别 | 运算符 |
|---|---|
| 后缀自增/自减 | ++, -- |
| 前缀自增/自减和一元运算符 | ++, --, +, -, !, ~ |
| 乘法性 | *, /, % |
| 加法性 | +, - |
| 移位 | <<, >> |
| 关系 | <, <=, >, >= |
| 相等性 | ==, != |
| 按位与 | & |
| 按位异或 | ^ |
| 按位或 | | |
| 逻辑与 | && |
| 逻辑或 | || |
| 三元条件 | ? : |
| 赋值 | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= |
赋值运算符优先级最低,而后缀自增/自减位于顶层。
示例 1:运算符优先级
using System;
namespace OperatorDemo {
class OperatorPrecedence {
public static void Main(string[] args) {
int result1;
int a = 5, b = 6, c = 4;
result1 = --a * b - ++c;
Console.WriteLine(result1);
bool result2;
result2 = b >= c + a;
Console.WriteLine(result2);
}
}
}
运行该程序输出:
19 False
求值步骤:
(--a)→ 4 (a 变为 4)(++c)→ 5 (c 变为 5)(a * b)→ 24- 相减:24 - 5 = 19
第二个表达式表明加法 + 优先于比较 >=,因此先计算 c + a 再进行比较。
C# 中的运算符结合性
当两个运算符具有相同优先级时,编译器使用结合性决定求值顺序。大多数 C# 运算符是左结合(从左向右),但也有少数是右结合(从右向左)。
示例:
int a = 5, b = 6, c = 3; int result = a * b / c;
因为 * 和 / 都是左结合,所以先执行乘法,得到 10。
右结合在赋值链中至关重要:
int a = 5, b = 6, c = 3; a = b = c;
值 3 先赋给 b,再将 b 赋给 a,最终三个变量都持有 3。
下表总结了 C# 运算符的结合性。
| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀自增/自减 | ++, -- | 左到右 |
| 前缀自增/自减和一元运算符 | ++, --, +, -, !, ~ | 右到左 |
| 乘法性 | *, /, % | 左到右 |
| 加法性 | +, - | 左到右 |
| 移位 | <<, >> | 左到右 |
| 关系 | <, <=, >, >= | 左到右 |
| 相等性 | ==, != | 左到右 |
| 按位与 | & | 左到右 |
| 按位异或 | ^ | 左到右 |
| 按位或 | | | 左到右 |
| 逻辑与 | && | 左到右 |
| 逻辑或 | || | 左到右 |
| 三元条件 | ? : | 右到左 |
| 赋值 | =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= | 右到左 |
关键的右结合运算符包括一元前缀运算符、三元条件运算符以及所有赋值运算符。
示例 2:结合性实战
using System;
namespace OperatorDemo {
class OperatorAssociativity {
public static void Main(string[] args) {
int a = 5, b = 6, c = 3;
int result = a * b / c;
Console.WriteLine(result);
a = b = c;
Console.WriteLine($"a = {a}, b = {b}, c = {c}");
}
}
}
输出结果:
10 a = 3, b = 3, c = 3
C语言