Skip to content

C# - 运算符

运算符是指导编译器执行特定数学、逻辑或其他操作的符号。C# 提供了丰富的内置运算符,可分为以下几类:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 位运算符和移位运算符
  • 赋值运算符
  • 其他运算符(类型测试、空值合并等)

这些运算符执行标准数学计算。假设 int a = 10; 且 int b = 3;。

运算符描述示例
+加法a + b 为 13
-减法a - b 为 7
*乘法a * b 为 30
/除法a / b 为 3 (整数除法截断余数)
%模(余数)a % b 为 1
++递增 1a++ 先使用 a 的值,然后将其递增到 11
--递减 1a-- 先使用 a 的值,然后将其递减到 9
// 示例
int x = 10, y = 4;
Console.WriteLine($"Addition: {x + y}"); // 输出: 14
Console.WriteLine($"Division: {x / y}"); // 输出: 2
Console.WriteLine($"Modulus: {x % y}"); // 输出: 2
// 对于浮点除法,将其中一个操作数转换为 float/double 类型
Console.WriteLine($"Floating-point Division: {(double)x / y}"); // 输出: 2.5

这些运算符比较两个操作数并返回一个 bool 值(true 或 false)。假设 int a = 10; 且 int b = 20;。

运算符描述示例
==等于a == b 为 false
!=不等于a != b 为 true
>大于a > b 为 false
<小于a < b 为 true
>=大于或等于a >= b 为 false
<=小于或等于a <= b 为 true
// 示例
int a = 20, b = 15;
Console.WriteLine($"Is a > b? {a > b}"); // 输出: True
Console.WriteLine($"Is a == b? {a == b}"); // 输出: False

这些运算符用于组合 bool 表达式。它们是创建 if 语句和循环中复杂条件的基础。

运算符描述示例 (A 为 true, B 为 false)
&&逻辑与(短路)A && B 为 false
||逻辑或(短路)A || B 为 true
!逻辑非(取反)!A 为 false
// 示例
bool hasKey = true;
int coins = 50;
bool canOpenChest = hasKey && coins >= 100;
Console.WriteLine($"Can open chest? {canOpenChest}"); // 输出: False

这些运算符将值赋给变量。复合赋值运算符提供了一种简写形式,可以在一步中完成操作和赋值。

运算符示例等效于
=x = 5;x = 5;
+=x += 5;x = x + 5;
-=x -= 5;x = x - 5;
*=x *= 5;x = x * 5;
/=x /= 5;x = x / 5;
??=x ??= 5;x = (x ?? 5); (仅当 x 为 null 时赋值)
// 示例
int score = 100;
score += 50; // 增加 50 分
Console.WriteLine($"Final Score: {score}"); // 输出: 150
string name = null;
name ??= "Guest"; // 赋值 "Guest",因为 name 为 null
Console.WriteLine($"User: {name}"); // 输出: Guest

C# 还包括其他一些用于各种任务的强大运算符。

运算符名称描述
?:三元条件运算符一个 if-else 语句的简写形式。condition ? val_if_true : val_if_false。
??空值合并运算符如果左侧操作数不为 null,则返回左侧操作数;否则,返回右侧操作数。
?.空值条件运算符 (Elvis)安全地访问成员。如果操作数为 null,则表达式评估为 null 而不是抛出异常。
typeof()类型返回某个类型的 System.Type 对象。
sizeof()大小返回值类型的大小(以字节为单位)。非基元类型需要 unsafe 上下文。
nameof()名称将变量、类型或成员的名称作为字符串字面量返回。
is类型检查检查对象是否为特定类型,返回 true 或 false。
as类型转换将对象转换为特定类型而不抛出异常;如果转换失败则返回 null。
// 三元运算符和空值合并运算符示例
int age = 21;
string status = (age >= 18) ? "Adult" : "Minor";
Console.WriteLine($"Status: {status}"); // 输出: Adult
string displayName = null;
string username = displayName ?? "User123";
Console.WriteLine($"Username: {username}"); // 输出: User123
// 空值条件运算符示例
string[] names = { "Alice", "Bob" };
//string[] names = null;
int? count = names?.Length; // count 是 int?(可空 int)
Console.WriteLine($"Number of names: {count ?? 0}"); // 安全地获取长度,如果为 null 则默认为 0

运算符优先级决定了复杂表达式中的求值顺序。例如,* 的优先级高于 +。

尽管了解规则很有用,但最佳实践是使用括号 () 来明确你的意图。这可以提高代码可读性并防止细微的错误。

// 不清晰:依赖读者了解优先级
int result1 = 3 + 4 * 5; // 23
// 清晰:顺序明确且具有自解释性
int result2 = 3 + (4 * 5); // 23
Console.WriteLine($"Result 1: {result1}, Result 2: {result2}");

有关所有运算符及其优先级级别的详细分解,请参阅我们专门的C# 运算符优先级教程。