C# 运算符
关键要点
- C# 运算符包括算术、关系、逻辑、位、赋值和其他类型,用于执行数学、比较、逻辑和位操作。
- 研究表明,算术运算符如加减乘除适合数值计算,关系运算符用于比较,逻辑运算符处理布尔值。
- 位运算符对二进制位操作,赋值运算符简化赋值操作,其他运算符如条件运算符(?:)和空值合并运算符(??)提供额外功能。
- 运算符优先级影响表达式计算顺序,可用括号调整。
运算符分类
C# 提供了多种运算符,分为以下几类:
- 算术运算符:如
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取模)、++
(自增)、--
(自减),用于数值计算。 - 关系运算符:如
==
(等于)、!=
(不等于)、>
(大于)、<
(小于)、>=
(大于等于)、<=
(小于等于),用于比较两个值。 - 逻辑运算符:如
&&
(逻辑与)、||
(逻辑或)、!
(逻辑非),用于布尔逻辑操作。 - 位运算符:如
&
(位与)、|
(位或)、^
(位异或)、~
(位非)、<<
(左移)、>>
(右移),用于二进制位操作。 - 赋值运算符:如
=
(赋值)、+=
(加赋值)、-=
(减赋值)等,简化赋值操作。 - 其他运算符:如条件运算符
?:
、空值合并运算符??
、Lambda 运算符=>
,提供额外功能。
示例与使用
以下是每个类别的简单示例:
- 算术:
int sum = 10 + 5;
(结果为 15) - 关系:
bool isGreater = 10 > 5;
(结果为 true) - 逻辑:
bool result = true && false;
(结果为 false) - 位:
int andResult = 10 & 5;
(结果为 0) - 赋值:
int a = 10; a += 5;
(a 变为 15) - 其他:
int max = (10 > 5) ? 10 : 5;
(max 为 10)
更多详情请参考:
C# 运算符的全面分析
C# 是一种由微软开发的现代、面向对象的编程语言,其运算符是编程中的核心工具,用于执行数学、逻辑、比较和位操作等任务。本报告基于可靠的中文资源(如菜鸟教程、Microsoft Learn 和 CSDN 博客)进行整理,截至 2025 年 8 月 4 日,确保内容的准确性和时效性。
背景与概述
运算符是一种告诉编译器执行特定操作的符号,C# 提供了丰富的内置运算符,分类如下:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其他运算符
这些运算符可以组合成复杂的表达式,运算符的优先级和结合性决定了表达式的计算顺序。以下将逐一讲解每类运算符的定义、使用方法和注意事项。
1. 算术运算符
算术运算符用于执行基本的数学操作,包括加法、减法、乘法、除法和取模。
- 定义与功能:
+
:将两个操作数相加。-
:从第一个操作数中减去第二个操作数。*
:将两个操作数相乘。/
:将第一个操作数除以第二个操作数。%
:返回第一个操作数除以第二个操作数的余数。++
:自增运算符,将操作数的值增加 1。--
:自减运算符,将操作数的值减少 1。- 示例代码:
int a = 10;
int b = 5;
int c = a + b; // c = 15
int d = a - b; // d = 5
int e = a * b; // e = 50
int f = a / b; // f = 2
int g = a % b; // g = 0
a++; // a = 11
b--; // b = 4
- 注意事项:
- 整数除法会自动舍弃小数部分(向零取整)。
- 如果操作数是浮点类型(如
float
或double
),结果将保留小数部分。 - 整数除以零会引发
DivideByZeroException
,浮点数除以零会返回Infinity
。 ++
和--
有前缀和后缀形式:- 前缀(如
++a
):先增加值,再使用。 - 后缀(如
a++
):先使用原值,再增加。
- 前缀(如
- 适用场景:数值计算、计数器更新。
2. 关系运算符
关系运算符用于比较两个操作数之间的关系,返回布尔值(true
或 false
)。
- 定义与功能:
==
:检查两个操作数是否相等。!=
:检查两个操作数是否不相等。>
:检查第一个操作数是否大于第二个操作数。<
:检查第一个操作数是否小于第二个操作数。>=
:检查第一个操作数是否大于或等于第二个操作数。<=
:检查第一个操作数是否小于或等于第二个操作数。- 示例代码:
int a = 10;
int b = 5;
bool isEqual = (a == b); // false
bool isNotEqual = (a != b); // true
bool isGreater = (a > b); // true
bool isLess = (a < b); // false
bool isGreaterOrEqual = (a >= b); // true
bool isLessOrEqual = (a <= b); // false
- 注意事项:
- 关系运算符的结果总是布尔类型,适合用于条件判断。
- 对于引用类型,
==
和!=
默认比较引用是否相同(内存地址),可以通过重载Equals
方法自定义比较逻辑。 - 适用场景:条件判断、数据比较。
3. 逻辑运算符
逻辑运算符用于执行布尔逻辑操作。
- 定义与功能:
&&
:逻辑与,如果两个操作数都为true
,则返回true
。||
:逻辑或,如果两个操作数中至少有一个为true
,则返回true
。!
:逻辑非,反转操作数的布尔值。- 示例代码:
bool a = true;
bool b = false;
bool andResult = (a && b); // false
bool orResult = (a || b); // true
bool notResult = !a; // false
- 注意事项:
&&
和||
是短路运算符,即如果左侧操作数已确定结果,右侧操作数可能不会被计算。例如,在false && SomeMethod()
中,SomeMethod
不会被调用。&
和|
是非短路逻辑运算符,总是计算两个操作数,适合位操作。- 适用场景:条件组合、布尔逻辑判断。
4. 位运算符
位运算符用于对整数类型的位进行操作。
- 定义与功能:
&
:位与,两个位都为 1 时结果为 1。|
:位或,两个位中至少有一个为 1 时结果为 1。^
:位异或,两个位不同时结果为 1。~
:位非,反转操作数的每一位。<<
:左移,将操作数的位向左移动指定的位数。>>
:右移,将操作数的位向右移动指定的位数。- 示例代码:
int a = 10; // 二进制: 1010
int b = 5; // 二进制: 0101
int andResult = a & b; // 1010 & 0101 = 0000 (0)
int orResult = a | b; // 1010 | 0101 = 1111 (15)
int xorResult = a ^ b; // 1010 ^ 0101 = 1111 (15)
int notResult = ~a; // ~1010 = 0101 (5) 注意:在补码表示中,~a = -a - 1
int leftShift = a << 1; // 1010 << 1 = 10100 (20)
int rightShift = a >> 1;// 1010 >> 1 = 0101 (5)
- 注意事项:
- 位运算适用于整数类型(如
int
、long
),不适用于浮点数。 ~
运算在补码表示中需要注意符号位的影响。- 移位操作的位数通常用无符号整数表示,超出位数会被忽略。
- 适用场景:位操作、标志位管理、性能优化。
5. 赋值运算符
赋值运算符用于将值赋给变量。
- 定义与功能:
=
:简单赋值,将右侧操作数的值赋给左侧操作数。+=
:加法赋值,将右侧操作数加到左侧操作数上,并将结果赋给左侧操作数。-=
:减法赋值,将右侧操作数从左侧操作数中减去,并将结果赋给左侧操作数。*=
:乘法赋值,将左侧操作数乘以右侧操作数,并将结果赋给左侧操作数。/=
:除法赋值,将左侧操作数除以右侧操作数,并将结果赋给左侧操作数。%=
:取模赋值,将左侧操作数除以右侧操作数的余数赋给左侧操作数。&=
:位与赋值,将左侧操作数与右侧操作数进行位与操作,并将结果赋给左侧操作数。|=
:位或赋值,将左侧操作数与右侧操作数进行位或操作,并将结果赋给左侧操作数。^=
:位异或赋值,将左侧操作数与右侧操作数进行位异或操作,并将结果赋给左侧操作数。<<=
:左移赋值,将左侧操作数向左移指定的位数,并将结果赋给左侧操作数。>>=
:右移赋值,将左侧操作数向右移指定的位数,并将结果赋给左侧操作数。- 示例代码:
int a = 10;
a += 5; // a = 15
a -= 3; // a = 12
a *= 2; // a = 24
a /= 4; // a = 6
a %= 3; // a = 0
a &= 5; // a = 0
a |= 3; // a = 3
a ^= 1; // a = 2
a <<= 1; // a = 4
a >>= 1; // a = 2
- 注意事项:
- 复合赋值运算符等同于
a = a op b
,如a += b
等同于a = a + b
。 - 赋值运算符的左侧必须是变量、属性或索引器,不能是常量或只读表达式。
- 适用场景:变量更新、累加计算。
6. 其他运算符
C# 中还有一些特殊运算符,提供额外的功能。
- 条件运算符 (?:):
- 语法:
condition ? value1 : value2
,如果条件为true
,返回value1
,否则返回value2
。 - 示例:
int a = 10; int b = 20; int max = (a > b) ? a : b; // max = 20
- 空值合并运算符 (??):
- 语法:
a ?? b
,如果a
不为null
,返回a
,否则返回b
。 - 示例:
int? x = null; int y = x ?? 100; // y = 100
- 空值合并赋值运算符 (??=):
- 语法:
a ??= b
,如果a
为null
,则将b
赋值给a
。 - 示例:
int? x = null; x ??= 50; // x = 50
- Lambda 运算符 (=>):
- 用于定义 Lambda 表达式,语法为
parameters => expression
。 - 示例:
Func<int, int> square = x => x * x; Console.WriteLine(square(5)); // 25
- 指针运算符 (*, ->, &, &&, ||):
- 用于不安全代码中的指针操作,需在
unsafe
块中使用。 - 注意事项:
- 条件运算符是 C# 中的三元运算符,简洁替代
if-else
。 - 空值合并运算符适合处理可空类型,减少
null
检查。 - 适用场景:条件判断、默认值设置、函数式编程。
运算符优先级与结合性
运算符的优先级决定了表达式中操作的执行顺序,优先级高的运算符先执行。以下是部分运算符的优先级表(从高到低):
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () (括号) | 从左到右 |
2 | ++ -- ! ~ (一元运算符) | 从右到左 |
3 | * / % | 从左到右 |
4 | + - | 从左到右 |
5 | << >> | 从左到右 |
6 | < <= > >= is as | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ?: (条件运算符) | 从右到左 |
14 | = += -= *= /= %= &= |= ^= <<= >>= ??= | 从右到左 |
- 注意事项:可以通过括号
()
改变优先级,例如(a + b) * c
和a + (b * c)
的结果不同。 - 适用场景:复杂表达式计算,需注意优先级以避免逻辑错误。
总结与建议
C# 的运算符是编程语言中不可或缺的一部分,它们提供了方便的方式来执行各种操作。理解和掌握这些运算符的使用方法有助于编写更高效、更清晰的代码。初学者建议从算术和关系运算符开始熟悉,逐步掌握位运算和逻辑运算的用法。对于复杂表达式,注意运算符优先级和结合性。
参考资源: