在 C# 中,运算符是术语或符号,它接受一个或多个称为操作数的表达式作为输入并返回值。接受一个操作数的运算符被称作一元运算符,例如增量运算符 (++) 或 new。接受两个操作数的运算符被称作二元运算符,例如算术运算符 +、-、*、/。条件运算符 ?: 接受三个操作数,是 C# 中唯一的三元运算符。
下面的 C# 语句包含一个一元运算符和一个操作数。增量运算符 ++ 修改操作数 y 的值:
| C# | 复制代码 |
|---|---|
y++; | |
下面的 C# 语句包含两个二元运算符,它们分别有两个操作数。赋值运算符 = 将一个整数 y 和一个表达式 2 + 3 作为操作数。表达式 2 + 3 本身包含加运算符,并使用整数值 2 和 3 作为操作数:
| C# | 复制代码 |
|---|---|
y = 2 + 3; | |
操作数可以是任何大小、由任何数量的其他操作组成的有效表达式。
表达式中的运算符按照称为运算符优先级的特定顺序计算。下表根据运算符执行的操作类型将它们划分到不同的类别中。类别按优先级顺序列出。
|
基本 |
x.y、f(x)、a[x]、x++、x--、new、typeof、checked、unchecked |
|
一元 |
+、-、!、~、++x、--x、(T)x |
|
算术 -- 乘法 |
*, /, % |
|
算术 -- 加法 |
+, - |
|
移位 |
<<, >> |
|
关系和类型检测 |
<, >, <=, >=, is, as |
|
相等 |
==, != |
|
逻辑(按优先级顺序) |
&, ^, | |
|
条件(按优先级顺序) |
&&, ||, ?: |
|
赋值 |
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= |
当表达式中出现两个具有相同优先级的运算符时,它们根据结合性进行计算。左结合运算符按从左到右的顺序计算。例如,x * y / z 计算为 (x * y) / z。右结合运算符按从右到左的顺序计算。赋值运算符和三元运算符 (?:) 是右结合运算符。其他所有二元运算符都是左结合运算符。然而,C# 标准没有指定何时执行表达式中的增量指令的“设置”部分。例如,下面的代码示例的输出为 6:
| C# | 复制代码 |
|---|---|
int num1 = 5; num1++; System.Console.WriteLine(num1); | |
而下面的代码示例的输出却是未定义的:
| C# | 复制代码 |
|---|---|
int num2 = 5; num2 = num2++; //not recommended System.Console.WriteLine(num2); | |
因此,建议不要使用后一个示例。可以在表达式两侧使用括号来强制在计算其他任何表达式之前计算该表达式。例如,2 + 3 * 2 正常情况下计算为 8。这是因为乘法运算符的优先级高于加法运算符。将该表达式写为 (2 + 3 ) * 2 的形式,结果将是 10,因为它指示 C# 编译器必须在计算乘法运算符 * 之前计算加法运算符 +。
对于自定义的类和结构,您可以更改运算符的行为。此过程称为运算符重载。有关更多信息,请参见可重载运算符(C# 编程指南)。