C# 中的运算符
运算符是一种符号,告诉编译器执行特定的数学或逻辑操作。C# 拥有一套丰富的内置运算符,并提供以下类型的运算符:
-
-
-
-
-
-
本教程将逐一解释算术、关系、逻辑、位、赋值以及其他运算符。
算术运算符
下表列出了 C# 支持的所有算术运算符。假设变量 A
的值为 10,变量 B
的值为 20:
运算符 |
描述 |
示例 |
+ |
加两个操作数 |
A + B = 30 |
- |
第一操作数减去第二操作数 |
A - B = -10 |
* |
两个操作数相乘 |
A * B = 200 |
/ |
分子除以分母 |
B / A = 2 |
% |
取模运算,取整除后的余数 |
B % A = 0 |
++ |
自增运算符,整数值加一 |
A++ = 11 |
-- |
自减运算符,整数值减一 |
A-- = 9 |
关系运算符
下表列出了 C# 支持的所有关系运算符。假设变量 A
的值为 10,变量 B
的值为 20:
运算符 |
描述 |
示例 |
== |
检查两个操作数的值是否相等 |
(A == B) 不成立 |
!= |
检查两个操作数的值是否不相等 |
(A != B) 成立 |
> |
检查左操作数的值是否大于右操作数 |
(A > B) 不成立 |
< |
检查左操作数的值是否小于右操作数 |
(A < B) 成立 |
>= |
检查左操作数的值是否大于等于右操作数 |
(A >= B) 不成立 |
<= |
检查左操作数的值是否小于等于右操作数 |
(A <= B) 成立 |
逻辑运算符
下表列出了 C# 支持的所有逻辑运算符。假设变量 A
持有布尔值 true
,变量 B
持有布尔值 false
:
运算符 |
描述 |
示例 |
&& |
称为逻辑与运算符。如果两个操作数均为非零,则条件为真 |
(A && B) 为假 |
|
|
|
! |
称为逻辑非运算符。反转其操作数的逻辑状态。如果条件为真,则逻辑非运算符将其变为假 |
!(A && B) 为真 |
位运算符
位运算符在位级别上工作并对位逐个执行操作。以下是 &
, |
, ^
的真值表:
p |
q |
p & q |
p |
q |
p ^ q |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
假设 A = 60
;且 B = 13
;则在二进制格式中如下:
A = 0011 1100
B = 0000 1101
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
C# 支持的位运算符如下表所示。假设变量 A
持有 60,变量 B
持有 13:
运算符 |
描述 |
示例 |
& |
二进制与运算符,如果两个操作数中都存在该位,则复制该位到结果 |
(A & B) = 12,即 0000 1100 |
|
|
二进制或运算符,如果任一操作数中存在该位,则复制该位 |
^ |
二进制异或运算符,如果仅在一个操作数中存在该位,则复制该位 |
(A ^ B) = 49,即 0011 0001 |
~ |
二进制补运算符,是单目运算符,其效果是对位进行‘翻转’ |
(~A) = -61,即 1100 0011 在二进制补码中由于是有符号的二进制数 |
<< |
二进制左移运算符。左操作数的值向左移动由右操作数指定的位数 |
A << 2 = 240,即 1111 0000 |
>> |
二进制右移运算符。左操作数的值向右移动由右操作数指定的位数 |
A >> 2 = 15,即 0000 1111 |
赋值运算符
C# 支持的赋值运算符如下:
运算符 |
描述 |
示例 |
= |
简单赋值运算符,将右侧操作数的值赋给左侧操作数 |
C = A + B 将 A + B 的值赋给 C |
+= |
加入并赋值运算符,它将右操作数加到左操作数,并将结果赋给左操作数 |
C += A 等同于 C = C + A |
-= |
减去并赋值运算符,它从左操作数减去右操作数,并将结果赋给左操作数 |
C -= A 等同于 C = C - A |
*= |
乘以并赋值运算符,它将右操作数与左操作数相乘,并将结果赋给左操作数 |
C *= A 等同于 C = C * A |
/= |
除以并赋值运算符,它将左操作数除以右操作数,并将结果赋给左操作数 |
C /= A 等同于 C = C / A |
%= |
取模并赋值运算符,它使用两个操作数取模,并将结果赋给左操作数 |
C %= A 等同于 C = C % A |
<<= |
左移并赋值运算符 |
C <<= 2 等同于 C = C << 2 |
>>= |
右移并赋值运算符 |
C >>= 2 等同于 C = C >> 2 |
&= |
位与并赋值运算符 |
C &= 2 等同于 C = C & 2 |
^= |
位异或并赋值运算符 |
C ^= 2 等同于 C = C ^ 2 |
|
= |
位或并赋值运算符 |
其他运算符
还有一些其他重要的运算符,包括 sizeof
, typeof
和 ?:
,被 C# 支持:
运算符 |
描述 |
示例 |
sizeof() |
返回数据类型的大小 |
sizeof(int),返回 4 |
typeof() |
返回类的类型 |
typeof(StreamReader) |
& |
返回变量的地址 |
&a 返回变量的实际地址 |
* |
指向一个变量 |
*a 创建名为 'a' 的指针指向一个变量 |
?: |
条件表达式 |
如果条件为真?然后值X:否则值Y |
is |
判断一个对象是否是某种类型 |
如果(Ford is Car) // 检查 Ford 是否是 Car 类的对象 |
as |
在类型转换失败时不抛出异常的转换 |
Object obj = new StringReader("Hello"); StringReader r = obj as StringReader; |
C# 中的运算符优先级
运算符优先级决定了表达式中的项是如何分组的。这影响了表达式的求值。某些运算符比其他的优先级更高;例如,乘法运算符的优先级高于加法运算符。
例如 x = 7 + 3 * 2;
,这里 x 被赋值为 13,而不是 20,因为 *
运算符的优先级高于 +
,因此首先计算的是 3*2
,然后将 7 加上结果。
在下表中,优先级最高的运算符位于表的顶部,优先级最低的位于底部。在一个表达式中,优先级较高的运算符首先被求值。
类别 |
运算符 |
结合性 |
后缀 |
() [] -> . ++ -- |
从左至右 |
单目 |
+ - ! ~ ++ -- (类型)* & sizeof |
从右至左 |
乘法 |
* / % |
从左至右 |
加法 |
+ - |
从左至右 |
移位 |
<< >> |
从左至右 |
关系 |
< <= > >= |
从左至右 |
等值 |
== != |
从左至右 |
位与 |
& |
从左至右 |
位异或 |
^ |
从左至右 |
位或 |
|
|
逻辑与 |
&& |
从左至右 |
逻辑或 |
|
|
条件 |
?: |
从右至左 |
赋值 |
= += -= *= /= %= >>= <<= &= ^= |
= |
逗号 |
, |
从左至右 |