2.2 运算符与表达式
2.2.1 运算符概述
C# 提供了丰富的运算符,用于对变量和值执行各种操作。运算符可以分为以下几类:
- 算术运算符:用于执行基本数学运算(
+,-,*,/,%) - 关系运算符:用于比较两个值(
==,!=,>,<,>=,<=) - 逻辑运算符:用于组合或反转布尔条件(
&&,||,!) - 赋值运算符:用于给变量赋值(
=,+=,-=,*=,/=等) - 位运算符:用于对二进制位进行操作(
&,|,^,~,<<,>>) - 其他运算符:包括条件运算符(
?:)、成员访问运算符(.)等
2.2.2 表达式与运算符优先级
表达式是由运算符和操作数组成的代码片段,可以计算出一个值。例如:
int result = (10 + 5) * 2; // 表达式:(10 + 5) * 2
运算符的优先级决定了表达式中运算的执行顺序。以下是常见运算符的优先级(从高到低):
- 括号
() - 一元运算符(
++,--,!,~) - 乘除取模(
*,/,%) - 加减(
+,-) - 移位(
<<,>>) - 关系运算符(
<,>,<=,>=) - 相等性(
==,!=) - 逻辑与
&、逻辑异或^、逻辑或| - 条件与
&&、条件或|| - 条件运算符
?: - 赋值运算符
=,+=,-=等
2.2.3 常用运算符详解
算术运算符
int a = 10, b = 3;
int sum = a + b; // 13
int difference = a - b; // 7
int product = a * b; // 30
int quotient = a / b; // 3 (整数除法)
int remainder = a % b; // 1 (取模)
关系运算符
bool isEqual = (a == b); // false
bool isGreater = (a > b); // true
bool isLessOrEqual = (a <= 10); // true
逻辑运算符
bool x = true, y = false;
bool andResult = x && y; // false
bool orResult = x || y; // true
bool notResult = !x; // false
赋值运算符
int num = 10;
num += 5; // 等同于 num = num + 5;
num *= 2; // 等同于 num = num * 2;
条件运算符(三元运算符)
int age = 20;
string status = (age >= 18) ? "Adult" : "Minor"; // "Adult"
2.2.4 运算符重载
C# 允许对用户定义的类型重载运算符,使其支持自定义操作:
public class Vector
{
public int X { get; set; }
public int Y { get; set; }
public static Vector operator +(Vector v1, Vector v2)
{
return new Vector { X = v1.X + v2.X, Y = v1.Y + v2.Y };
}
}
// 使用重载的+运算符
Vector v1 = new Vector { X = 1, Y = 2 };
Vector v2 = new Vector { X = 3, Y = 4 };
Vector sum = v1 + v2; // sum.X = 4, sum.Y = 6
2.2.5 表达式中的类型转换
在表达式中混合使用不同类型时,C# 会自动进行隐式转换或要求显式转换:
int i = 10;
double d = 3.14;
double result = i + d; // 隐式转换int为double
decimal dec = (decimal)d; // 显式转换double为decimal
2.2.6 最佳实践
- 使用括号明确运算顺序,提高代码可读性
- 避免过度复杂的表达式,可拆分为多个步骤
- 注意整数除法和浮点数除法的区别
- 谨慎使用运算符重载,确保语义清晰
- 注意隐式类型转换可能带来的精度损失
练习
- 编写一个表达式,计算圆的面积(半径r=5,π使用Math.PI)
- 创建一个包含运算符重载的复数类,支持加减运算
- 分析表达式
5 + 3 * 2 > 10 && 4 < 6 || true的计算过程和结果
