C# 运算符优先级和关联性
C# 运算符优先级和关联性
在本教程中,我们将学习 C# 中的运算符优先级和关联性。这将使我们了解 C# 编译器如何评估表达式。
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
C语言