C# 运算符优先级
运算符优先级是一组定义表达式如何被求值的规则。在C#中,每个C#运算符都有一个指定的优先级,并且根据这些优先级来对表达式进行求值。
例如,乘法(*)
运算符的优先级高于加法(+)
运算符的优先级。因此,涉及乘法的运算会比加法先执行。
看下面的语句。
int x = 4 + 3 * 5;
执行该语句后,x的值是多少?
操作数3
与+
和*
相关联。如前所述,乘法的优先级高于加法。因此,执行的是3 * 5
运算,而不是4 + 3
。变量x的值将是19
。
如果加法具有更高的优先级,则会先计算4 + 3
,变量x的值将是35
。
运算符优先级表
运算符的优先级越高,它在表中出现的位置也越高
赋值运算符的优先级最低,而后缀自增和自减运算符的优先级最高。
示例 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
。
在下一个表达式中,+
的优先级高于>=
。因此,首先将c和a相加,然后将和与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。因此,执行该语句后,a、b和c的值都将是3
。
下表显示了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