C# - 运算符优先级
运算符优先级决定了表达式中各项的组合方式。这会影响表达式的求值。某些运算符的优先级高于其他运算符;例如,乘法运算符的优先级高于加法运算符。
例如 x = 7 + 3 * 2; 在这里,x 被赋值为 13,而不是 20,因为 * 运算符的优先级高于 +,因此首先计算 3*2,然后将 7 加到其结果上。
C# 运算符优先级表
在这里,优先级最高的运算符出现在表格顶部,优先级最低的出现在底部。在表达式中,优先级较高的运算符会先被求值。
| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ - - | 从左到右 |
| 一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 |
| 乘法 | * / % | 从左到右 |
| 加法 | + - | 从左到右 |
| 移位 | << >> | 从左到右 |
| 关系 | < <= > >= | 从左到右 |
| 相等 | == != | 从左到右 |
| 按位与 | & | 从左到右 |
| 按位异或 | ^ | 从左到右 |
| 按位或 | | | 从左到右 |
| 逻辑与 | && | 从左到右 |
| 逻辑或 | || | 从左到右 |
| 条件 | ?: | 从右到左 |
| 赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 从右到左 |
| 逗号 | , | 从左到右 |
C# 运算符优先级级别
下表显示了 C# 运算符优先级的级别:
| 优先级级别 | 运算符 | 结合性 |
|---|---|---|
| 最高 (1) | () [] . | 从左到右 |
| 2 | ++ -- (后缀) | 从左到右 |
| 3 | ++ -- + - (前缀) ! ~ | 从右到左 |
| 4 | * / % | 从左到右 |
| 5 | + - | 从左到右 |
| 6 | << >> | 从左到右 |
| 7 | < <= > >= | 从左到右 |
| 8 | == != | 从左到右 |
| 9 | & | 从左到右 |
| 10 | ^ | 从左到右 |
| 11 | | | 从左到右 |
| 12 | && | 从左到右 |
| 13 | || | 从左到右 |
| 14 | ?: (三元) | 从右到左 |
| 15 | = += -= *= /= %= &= ^= <<= >>= | 从右到左 |
| 最低 (16) | , (逗号运算符) | 从左到右 |
运算符优先级示例
此示例演示了如何根据运算符优先级求值一个包含多个运算符的表达式:
using System;
namespace OperatorsAppl {
class Program {
static void Main(string[] args) {
int a = 20;
int b = 10;
int c = 15;
int d = 5;
int e;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
Console.WriteLine("Value of (a + b) * c / d is : {0}", e);
e = ((a + b) * c) / d; // (30 * 15 ) / 5
Console.WriteLine("Value of ((a + b) * c) / d is : {0}", e);
e = (a + b) * (c / d); // (30) * (15/5) {0}", e);
e = a + (b * c) / d; // 20 + (150/5) {0}", e);
Console.ReadLine();
}
}
}
当上述代码编译并执行时,会产生以下结果 −
Value of (a + b) * c / d is : 90 Value of ((a + b) * c) / d is : 90
C# 运算符优先级更多示例
示例 1:乘法优先于加法
在这个示例中,乘法具有比加法更高的优先级。
using System;
class Program
{
static void Main()
{
int result = 10 + 5 * 2;
Console.WriteLine("Result: " + result);
}
}
当上述代码编译并执行时,会产生以下结果 −
Result: 20
示例 2:使用括号改变优先级
在这个示例中,括号改变了运算的优先级。
using System;
class Program
{
static void Main()
{
int result = (10 + 5) * 2;
Console.WriteLine("Result: " + result);
}
}
当上述代码编译并执行时,会产生以下结果 −
Result: 30
示例 3:结合逻辑运算符和关系运算符
在这个示例中,关系运算符在逻辑 AND 之前执行。
using System;
class Program
{
static void Main()
{
bool result = 5 > 3 && 10
当上述代码编译并执行时,会产生以下结果 −
Result: True
C# 运算符结合性
当表达式中多个具有相同优先级的运算符时,运算符的结合性决定了执行顺序。
运算符结合性表
结合性
执行顺序
示例
从左到右
先执行左操作数
a - b + c (a - b) + c
从右到左
先执行右操作数
a = b = c a = (b = c)
运算符结合性示例
在这个示例中,赋值运算符从右到左执行。
using System;
class Program
{
static void Main()
{
int a, b, c;
a = b = c = 10; // 从右到左赋值
Console.WriteLine("a: " + a + ", b: " + b + ", c: " + c);
}
}
当上述代码编译并执行时,会产生以下结果 −
a: 10, b: 10, c: 10
常见问题解答 (FAQ)
Q1: C# 中哪个运算符具有最高优先级?
括号 ()、数组索引 [] 和点运算符 . 具有最高优先级。
Q2: 当两个运算符具有相同优先级时会发生什么?
如果两个运算符具有相同优先级,则结合性规则决定顺序。例如,* 和 / 从左到右求值。
Q3: 如何避免运算符优先级造成的混淆?
避免错误的最佳方法是使用括号 () 明确执行顺序。