在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, -, *, =
转载于:https://blog.51cto.com/13373212/1970196