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:组合逻辑运算符和关系运算符

在此示例中,关系运算符在逻辑"与"运算之前执行。

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; // Right to left assignment

        Console.WriteLine("a: " + a + ", b: " + b + ", c: " + c);
    }
}

当编译并执行上述代码时,它会产生以下结果 -

a: 10, b: 10, c: 10

常见问题解答 (FAQ)

问题 1:C# 中哪个运算符的优先级最高?

括号 ()、数组索引 [] 和点运算符 . 等运算符的优先级最高。

问题 2:当两个运算符的优先级相同时会发生什么?

如果两个运算符的优先级相同,则结合性规则将决定它们的顺序。例如,*/ 的求值顺序是从左到右的。

问题 3:如何避免运算符优先级混淆?

避免错误的最佳方法是使用括号 () 来明确执行顺序。