跳到主要内容

C# 运算符优先级和结合性

提示
  1. 运算符优先级的概念:在C#中,不同运算符有不同的优先级,决定了表达式中操作的执行顺序。例如,乘法运算符 (*) 的优先级高于加法运算符 (+),因此先执行乘法操作。
  2. 结合性规则:当表达式中有相同优先级的运算符时,运算符的结合性(从左到右或从右到左)决定了操作的执行顺序。例如,赋值运算符 (=) 是从右到左结合的,所以先计算右侧的表达式。
  3. 实例分析:通过实例分析可以更好地理解运算符优先级和结合性的应用。例如,表达式 int result = --a * b - ++c; 的计算顺序首先是 --a++c,然后是乘法 *,最后是减法 -

C# 运算符优先级

运算符优先级是一组规则,用于定义如何计算表达式。在 C# 中,每个 C# 运算符 都有分配的优先级,并根据这些优先级来计算表达式。

例如,乘法运算符 (*) 的优先级高于加法运算符 (+)。因此,涉及乘法的操作先于加法进行。

看看下面的语句。

int x = 4 + 3 * 5;

执行这条语句后,x 的值会是多少?

操作数 3+* 相关。如前所述,乘法的优先级高于加法。所以,先执行 3 * 5 的操作,而不是 4 + 3。变量 x 的值将是 19

如果加法的优先级更高,4 + 3 将首先被计算,x 的值将是 35

运算符优先级表

运算符的优先级越高,它在表中出现的位置就越靠前

C# 运算符优先级

类别运算符
后缀递增和递减++, --
前缀递增、递减和一元++, --, +, -, !, ~
乘法类_, /, %
加法类+, -
移位<<, >>
关系<, <=, >, >=
相等性==, !=
位与&
位异或^
位或|
逻辑与&&
逻辑或||
三元? :
赋值=, +=, -=, _=, /=, %=, &=, |=, ^=, <<=, >>=

赋值运算符的优先级最低,而后缀递增和递减运算符的优先级最高。

示例 1:运算符优先级

using System;

namespace Operator
{
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

让我们来理解程序中表达式是如何被计算的。

--++ 的优先级高于 *,而 * 的优先级又高于 -。因此,

result1 = --a * b - ++c;

等效于

result1 = ((--a)*b)-(++c);

无论外部操作符的优先级如何,括号内的表达式总是首先被计算。

  • 首先,(--a) 被计算得到 4表达式中操作符优先级计算的第一步
  • 然后,(++c) 被计算得到 5表达式中操作符优先级计算的第二步
  • 接着,(a * b) 被计算得到 24表达式中操作符优先级计算的第三步
  • 最后,进行减法运算得到 19表达式中操作符优先级计算的最后一步
  • 因此,result1 的最终值将是 19

在下一个表达式中,+ 的优先级高于 >=。所以首先计算 ca 的和,然后将和与 b 进行比较产生 false

C# 操作符的结合性

在前面的部分,我们讨论了操作符的优先级。如果使用了优先级不同的两个操作符,优先级更高的操作符将首先被计算。

但如果两个操作符的优先级相同怎么办?

在这种情况下,表达式的计算基于操作符的结合性(从左到右或从右到左)。

例如:

int a = 5, b = 6, c = 3;
int result = a * b / c;

这里,*/ 的优先级相同。但由于这些操作符的结合性是从 左到右 的,所以首先计算 a * b,然后进行除法运算。这个表达式的最终结果将是 10

在这个特定的例子中,结合性并不真正重要。因为即使先进行除法再进行乘法,结果也不会受到影响。

让我们看另一个例子。

int a = 5, b = 6, c = 3;
a = b = c;

= 操作符的结合性是从 右到左 的。因此,c 的值(即 3)被赋给 b,然后 b 的值被赋给 a。所以执行这个语句后,abc 的值将会是 3

下表显示了 C# 操作符的结合性: C# 运算符结合性

类别运算符结合性
后缀递增和递减++, --从左到右
前缀递增、递减和一元++, --, +, -, !, ~从右到左
乘法类\_, /, %从左到右
加法类+, -从左到右
移位<<, >>从左到右
关系<, <=, >, >=从左到右
相等性==, != 从左到右
位与&从左到右
位异或^从左到右
位或|从左到右
逻辑与&&从左到右
逻辑或||从左到右
三元? :从右到左
赋值=, +=, -=, \_=, /=, %=, &=, | =, ^=, <<=, >>=从右到左

几乎所有的运算符都是从左到右的结合性。从右到左结合性的运算符包括:

  • 一元运算符
  • 前缀递增和递减运算符
  • 三元运算符
  • 赋值运算符

示例 2:运算符的结合性

using System;

namespace Operator
{
class OperatorPrecedence
{
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 = {0}, b = {1}, c = {2}", a, b, c);
}
}
}

当我们运行程序时,输出将是:

10
a = 3, b = 3, c = 3