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
  • 注意事项
  • 整数除法会自动舍弃小数部分(向零取整)。
  • 如果操作数是浮点类型(如 floatdouble),结果将保留小数部分。
  • 整数除以零会引发 DivideByZeroException,浮点数除以零会返回 Infinity
  • ++-- 有前缀和后缀形式:
    • 前缀(如 ++a):先增加值,再使用。
    • 后缀(如 a++):先使用原值,再增加。
  • 适用场景:数值计算、计数器更新。

2. 关系运算符

关系运算符用于比较两个操作数之间的关系,返回布尔值(truefalse)。

  • 定义与功能
  • ==:检查两个操作数是否相等。
  • !=:检查两个操作数是否不相等。
  • >:检查第一个操作数是否大于第二个操作数。
  • <:检查第一个操作数是否小于第二个操作数。
  • >=:检查第一个操作数是否大于或等于第二个操作数。
  • <=:检查第一个操作数是否小于或等于第二个操作数。
  • 示例代码
  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)
  • 注意事项
  • 位运算适用于整数类型(如 intlong),不适用于浮点数。
  • ~ 运算在补码表示中需要注意符号位的影响。
  • 移位操作的位数通常用无符号整数表示,超出位数会被忽略。
  • 适用场景:位操作、标志位管理、性能优化。

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,如果 anull,则将 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) * ca + (b * c) 的结果不同。
  • 适用场景:复杂表达式计算,需注意优先级以避免逻辑错误。

总结与建议

C# 的运算符是编程语言中不可或缺的一部分,它们提供了方便的方式来执行各种操作。理解和掌握这些运算符的使用方法有助于编写更高效、更清晰的代码。初学者建议从算术和关系运算符开始熟悉,逐步掌握位运算和逻辑运算的用法。对于复杂表达式,注意运算符优先级和结合性。

参考资源

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注