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
    1st step in evaluation of operator precedence in an expression
  • 然后计算(++c),结果为5
    2nd step in evaluation of operator precedence in an expression
  • 现在,计算(a * b),结果为24
    3rd step in evaluation of operator precedence in an expression
  • 最后,执行减法运算,结果为19
    Final step in evaluation of operator precedence in an expression
  • 因此,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
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战