C# 中,「运算符(Operator) 是程序的元素,这类元素会套用至表达式或语句中的一个或多个「操作数(Operand)只使用一个操作数的运算符称为++「一元」 new(Unary) 运算符,例如递增运算符 ( ) 使用两个操作数的运算符称为+「二元」-(Binary) 运算符,例如算术运算符 (*/ )还有一种运算符称为条件运算符 (?:),它会使用三个操作数而且是 C# 中唯一的三元运算符。

下列C# 语句包含一个一元运算符和一个操作数。递增运算符 ++会修改操作数 y的值。

C#

 

复制

y++;

下列C# 语句包含两个二元运算符,这两个运算符各有两个操作数。指派运算符 =的操作数为整数变数 y 和表达式 2+ 3 表达式 2 + 3 本身包含加号和两个操作数 2 3

C#

 

复制

y = 2 + 3;

运算符、评估和运算符优先级

操作数可以是由任何长度的程序代码撰写而成的有效表达式,而且可以包含任何数量的子表达式。在包含多个运算符的表达式中,套用运算符的顺序取决于「运算符优先级」(Operator Precedence)、「顺序关联性」(Associativity) 以及括号。

每个运算符都有定义的优先级。在包含多个运算符且运算符具有不同优先级层级的表达式中,运算符的优先级决定评估运算符的顺序。例如,下列语句会将 3 指派给 n1

n1 = 11 - 2 * 4;

因为乘法的优先级高于减法,所以会先执行乘法。

下表根据运算符所执行的运算类型,将运算符加以分类。分类是依照优先级列出。

主要运算符

表达式    描述

x.y

 

x?.y  成员存取

 

条件式成员存取

f(x)   方法和委派叫用

a[x]

 

a?[x]        数组和索引器存取

 

条件式数组和索引器存取

x++  后置递增

x--    后置递减

new T(...)建立对象和委派

new T(...){...}   使用初始化表达式建立对象。请参阅对象和集合初始化表达式。

new {...}   匿名物件初始化表达式。请参阅匿名型别。

new T[...]建立数组。请参阅数组。

typeof(T)取得 T System.Type 物件

checked(x)       在核取的内容中评估表达式

unchecked(x)   在未核取的内容中评估表达式

default (T)       取得类型 T 的默认值

delegate {}      匿名函式 (匿名方法)

一元运算符

表达式    描述

+x    识别

-x     否定

!x     逻辑否定

~x    位否定

++x  前置递增

--x    前置递减

(T)x  x 明确转换成类型 T

乘法类运算符

表达式    描述

*      乘法

/       除号

%     余数

加法类运算符

表达式    描述

x + y加法、字符串串连、委派组合

x - y减法、委派移除

移位运算符

表达式    说明

x << y       左移

x >> y       右移

关系和型别运算符

表达式    描述

x < y小于

x > y大于

x <= y       小于或等于

x >= y       大于或等于

x is T        如果 x T 则传回true,否则传回false

x as T       传回类型 T x,如果 x不是 T 则传回 null

等号比较运算符

表达式    描述

x == y       等于

x != y       不相等

逻辑、条件和Null 运算符

分类        表达式    描述

逻辑AND       x & y        整数字符 AND、布尔逻辑 AND

逻辑XOR       x ^ y整数字符 XOR、布尔逻辑 XOR

逻辑ORx | y整数字符 OR、布尔逻辑 OR

条件式AND   x && y     只有在 x true 时评估 y

条件式OR     x || y       只有在 x false 时评估 y

Null 联合        x ?? Y       如果 x null 则判断值为 y,否则判断值为 x

条件式    x? y : z    如果 x true 则判断值为 y;如果 x false 则判断值为 z

指派和匿名运算符

表达式    描述

=      指派

x op= y     复合指派。支援这些运算符:+=-=*=/=%=&=|=!=<<=>>=

(T x) => y匿名函式 (Lambda 表达式)

顺序关联性

当表达式中有两个以上具有相同优先级的运算符时,会根据顺序关联性评估这些运算符。左向关联运算符会依由左至右的顺序进行评估。例如, x * y / z 会判断值为 (x * y) / z右向关联运算符会依由右至左的顺序进行评估。例如,指派运算符就是右向关联。如果不是的话,下列程序代码将会产生错误。

C#

 

复制

int a, b, c; 

c = 1; 

// The following two lines are equivalent. 

a = b = c; 

a = (b = c); 

 

// The following line, which forces leftassociativity, causes an error. 

//(a = b) = c; 

另一个范例是右向关联的三元运算符(?:)大部分的二元运算符都是左向关联。

不论表达式中的运算符是左向关联还是右向关联,都会由左至右先行评估每个表达式的操作数。下列范例将说明运算符和操作数的评估顺序。

语句        评估的顺序

a = b        a, b, =

a = b + c  a, b, c, +, =

a = b + c * d    a,b, c, d, *, +, =

a = b * c + d    a,b, c, *, d, +, =

a = b - c + d     a,b, c, -, d, +, =

a += b -= c       a,b, c, -=, +=

加入括号

您可以使用括号变更运算符优先级和顺序关联性强制执行的顺序。例如, 2 + 3 * 2 正常情况下会判断值为 8,这是因为乘法类运算符的优先级高于加法类运算符。但是,如果您将表达式撰写为 (2 + 3) * 2,则会先评估加法再评估乘法,而得到的结果会是 10下列范例将说明以括号括住之表达式中的评估顺序。如先范例所示,套用运算符之前会先评估操作数。

语句        评估的顺序

a = (b + c) * d  a,b, c, +, d, *, =

a = b - (c + d)   a,b, c, d, +, -, =

a = (b + c) * (d - e)  a,b, c, +, d, e, -, *, =