1.1.1. 什么是操作符?
操作符是用于执行操作的符号。C#提供了丰富的操作符,用于各种常见的编程任务。操作符可以应用于变量和值,执行算术、比较、逻辑、位、赋值和其他操作。
1.1.2. 算术操作符
算术操作符用于执行基本的数学运算。C#中的常见算术操作符如下:
操作符 | 描述 | 示例 |
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取模(余数) | a % b |
++ | 自增 | a++ |
-- | 自减 | a-- |
示例代码:
int a = 10;
int 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
a++; // 11
b--; // 2
1.1.3. 关系操作符
关系操作符用于比较两个值或变量。C#中的常见关系操作符如下:
操作符 | 描述 | 示例 |
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于或等于 | a >= b |
<= | 小于或等于 | a <= b |
示例代码:
int a = 10;
int b = 3;
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
1.1.4. 逻辑操作符
逻辑操作符用于执行布尔逻辑运算。C#中的常见逻辑操作符如下:
操作符 | 描述 | 示例 |
&& | 逻辑与(AND) | a && b |
|| | 逻辑或(OR) | a || b |
! | 逻辑非(NOT) | !a |
示例代码:
bool a = true;
bool b = false;
bool result1 = a && b; // false
bool result2 = a || b; // true
bool result3 = !a; // false
1.1.5. 位操作符
位操作符用于按位(比特位)操作整数类型的数据,所以位操作符都是操作二进制数的。C#中的常见位操作符如下:
操作符 | 描述 | 示例 |
& | 按位与(AND) | a & b |
| | 按位或(OR) | a | b |
^ | 按位异或(XOR) | a ^ b |
~ | 按位取反(NOT) | ~a |
<< | 左移 | a << 2 |
>> | 右移 | a >> 2 |
示例代码:
int a = 5; // 0101
int b = 3; // 0011
int result1 = a & b; // 0001 (1)
int result2 = a | b; // 0111 (7)
int result3 = a ^ b; // 0110 (6)
int result4 = ~a; // 1010 (按位取反)
int result5 = a << 2; // 10100 (20)
int result6 = a >> 2; // 0001 (1)
位操作的左移、右移如下图所示:
1.1.6. 赋值操作符
赋值操作符用于给变量赋值。C#中的常见赋值操作符如下:
操作符 | 描述 | 示例 | 等价于 |
= | 简单赋值 | a = b | |
+= | 加且赋值 | a += b | a = a + b |
-= | 减且赋值 | a -= b | a = a - b |
*= | 乘且赋值 | a *= b | a = a * b |
/= | 除且赋值 | a /= b | a = a / b |
%= | 取模且赋值 | a %= b | a = a % b |
&= | 按位与且赋值 | a &= b | a = a & b |
|= | 按位或且赋值 | a |= b | a = a | b |
^= | 按位异或且赋值 | a ^= b | a = a ^ b |
<<= | 左移且赋值 | a <<= 2 | a = a << 2 |
>>= | 右移且赋值 | a >>= 2 | a = a >> 2 |
示例代码:
int a = 10;
a += 5; // 15
a -= 3; // 12
a *= 2; // 24
a /= 4; // 6
a %= 3; // 0
a &= 2; // 0
a |= 1; // 1
a ^= 3; // 2
a <<= 2; // 8
a >>= 1; // 4
1.1.7. 条件操作符
条件操作符也称三元操作符,用于根据条件表达式的真假值选择不同的结果。语法如下:
condition ? trueResult : falseResult;
示例代码:
int a = 10;
int b = 5;
int max = (a > b) ? a : b; // max = 10
1.1.8. 其他操作符
C#中还有一些其他的操作符,如typeof、sizeof、is、as等。
1.1.8.1. typeof
typeof用于获取类型的Type对象。
Type t = typeof(int); // t = System.Int32
1.1.8.2. sizeof
sizeof用于获取值类型的大小。
int size = sizeof(int); // size = 4
1.1.8.3. is
is用于检查对象是否是某个类型。
object obj = "hello";
bool isString = obj is string; // true
1.1.8.4. as
as用于进行类型转换,如果转换失败返回null。
object obj = "hello";
string str = obj as string; // str = "hello"
1.1.9. 运算符的优先级和结合性
运算符的优先级和结合性决定了运算的执行顺序。在表达式中,具有较高优先级的运算符先于优先级较低的运算符执行。结合性决定了具有相同优先级的运算符的计算顺序。运算符优先级表如下图所示,但我们记不住优先级时,加个小括号就行了。
表 2-1 运算符优先级表
优先级 | 运算符 | 描述 | 结合性 |
1 | ( ) | 括号 | 从左到右 |
2 | ++, --, !, ~ | 单目运算符 | 从右到左 |
3 | *, /, % | 乘法、除法、取模 | 从左到右 |
4 | +, - | 加法、减法 | 从左到右 |
5 | <<, >> | 移位运算 | 从左到右 |
6 | <, <=, >, >= | 关系运算符 | 从左到右 |
7 | ==, != | 相等运算符 | 从左到右 |
8 | & | 按位与 | 从左到右 |
9 | ^ | 按位异或 | 从左到右 |
10 | | | 按位或 | 从左到右 |
11 | && | 逻辑与 | 从左到右 |
12 | || | 逻辑或 | 从左到右 |
13 | ? : | 条件运算符 | 从右到左 |
14 | =, +=, -=, *=, /=, %= | 赋值运算符 | 从右到左 |
以下是C#中常见运算符的优先级表,从高到低排列:
示例代码:
int a = 10;
int b = 5;
int c = a + b * 2; // c = 20,乘法优先于加法
int d = (a + b) * 2; // d = 30,括号改变了优先级
1.1.10. 运算符重载
1.1.10.1. 运算符重载语法
运算符重载允许为自定义类型(类或结构体)定义特定的运算行为。运算符重载方法必须是 public 和 static 的,并且包含 operator 关键字。下面是运算符重载的基本语法:
public static 返回类型 operator 运算符(参数列表)
{
// 方法体
}
以下是一个重载+运算符的示例,我们定义了一个Complex类,代表复数。然后重载了+运算符,使其可以用于两个Complex对象的相加操作。
public class Complex
{
public double Real { get; set; }
public double Imaginary { get; set; }
public Complex(double real, double imaginary)
{
Real = real;
Imaginary = imaginary;
}
?
// 重载 + 运算符
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
}
?
public class Program
{
public static void Main()
{
Complex c1 = new Complex(1.0, 2.0);
Complex c2 = new Complex(3.0, 4.0);
Complex result = c1 + c2;
Console.WriteLine($"Result: {result.Real} + {result.Imaginary}i");
}
}
1.1.10.2. 可重载的运算符
C#中几乎所有的运算符都可以重载,但以下几个运算符除外:
(1) 条件运算符(&&, ||, ?:)
(2) 赋值运算符(=)
1.1.10.3. 运算符重载的限制
(1) 重载运算符必须是public和static的。
(2) 重载运算符必须至少有一个参数是类或结构体类型。
(3) 重载运算符不能更改运算符的优先级和结合性。