C#操作符和控制流程

1.操作符

1.1 概述

操作符是用于执行特定操作的符号,例如算术、比较、逻辑等。根据操作数的数量,操作符可以分为:

  • 一元操作符:作用于一个操作数,如 -x(取反)。
  • 二元操作符:作用于两个操作数,如 x + y
  • 三元操作符:作用于三个操作数,如条件操作符 condition ? true_value : false_value

2.1 算术操作符

算术操作符用于执行基本的数学计算,适用于数值类型(如 intdouble 等)。

操作符 功能 示例 注意事项
+ 加法/字符串拼接 int c = 3 + 5; string s = "a" + "b"; 字符串拼接产生新对象
- 减法 double d = 5.0 - 2.0; // 3.0 不支持ulong取负
* 乘法 float f = 2.5f * 2; // 5.0 整数乘法溢出时截断高位
/ 除法 int i = 7 / 2; // 3 double k = 7.0 / 2; // 3.5 整数除法舍去小数
% 取余 int r = 10 % 3; // 1 余数符号与被除数相同
++/-- 自增/自减 int x = 1; x++; // 2 前缀先运算后返回值,后缀反之

示例代码:

1
2
3
4
5
6
7
8
9
int a = 10;
int b = 5;
int sum = a + b;  // 15
int difference = a - b;  // 5
int product = a * b;  // 50
int quotient = a / b;  // 2
int remainder = a % b;  // 0
a++;  // a 现在是 11
b--;  // b 现在是 4

注意:

  • 自增和自减操作符有前置(++x)和后置(x++)之分。前置先执行操作再返回值,后置先返回值再执行操作。

1.3 赋值操作符

赋值操作符用于将值赋给变量,常见的包括简单赋值和复合赋值。

操作符 描述 示例
= 简单赋值 x = y
+= 加法赋值 x += y
-= 减法赋值 x -= y
*= 乘法赋值 x *= y
/= 除法赋值 x /= y
%= 取模赋值 x %= y

示例代码:

1
2
3
4
5
6
int x = 10;
x += 5;  // x = x + 5, x 现在是 15
x -= 3;  // x = x - 3, x 现在是 12
x *= 2;  // x = x * 2, x 现在是 24
x /= 4;  // x = x / 4, x 现在是 6
x %= 3;  // x = x % 3, x 现在是 0

说明:

  • 复合赋值操作符简化了代码,特别是在需要对变量进行多次修改时。

1.4 比较操作符

比较操作符用于比较两个值,返回布尔值(truefalse),常用于条件判断。

操作符 功能 示例 比较规则
==/!= 相等/不等 "abc" == "abc"; // true 字符串比较内容,引用类型比较地址(除string
>/< 大于/小于 5 > 3; // true 字符比较Unicode码值
>=/<= 大于等于/小于等于 4.5 <= 4.5; // true 浮点数比较需考虑精度误差

示例代码:

1
2
3
4
5
6
int a = 10;
int b = 20;
bool isEqual = (a == b);  // false
bool isNotEqual = (a != b);  // true
bool isGreater = (a > b);  // false
bool isLess = (a < b);  // true

注意:

  • 比较操作符常与控制流程语句(如 if)结合使用。

1.5 逻辑操作符

逻辑操作符用于组合布尔表达式,常见于复杂条件判断。

操作符 名称 描述
&& 逻辑与 x && y
` `
! 逻辑非 !x

示例代码:

1
2
3
4
5
bool x = true;
bool y = false;
bool andResult = x && y;  // false
bool orResult = x || y;  // true
bool notResult = !x;  // false

说明:

  • 逻辑操作符具有短路求值特性:&& 在左侧为 false 时不计算右侧,|| 在左侧为 true 时不计算右侧。

1.6 位操作符

位操作符用于操作整数的二进制位,适用于低级编程和性能优化。

操作符 功能 示例
& 按位与 6 & 3; // 2 (0b110 & 0b011 = 0b010)
` ` 按位或
^ 按位异或 6 ^ 3; // 5 (0b110 ^ 0b011 = 0b101)
~ 按位取反 ~6; // -7 (补码表示)
<</>> 左移/右移 4 << 1; // 8 -4 >> 1; // -2

示例代码:

1
2
3
4
5
6
7
8
int a = 5;  // 二进制 0101
int b = 3;  // 二进制 0011
int and = a & b;  // 0001 -> 1
int or = a | b;   // 0111 -> 7
int xor = a ^ b;  // 0110 -> 6
int notA = ~a;    // 1010 (4位) -> -6 (补码)
int leftShift = a << 1;  // 1010 -> 10
int rightShift = a >> 1; // 0010 -> 2

注意:

  • 位操作符在处理二进制数据、标志位等场景中非常有用。

1.7 其他操作符

C#还包括一些特殊操作符,增强了代码的表达能力。

  • 条件操作符(三元操作符): 语法:condition ? true_expression : false_expression 示例:

    1
    2
    
    int age = 20;
    string status = (age >= 18) ? "Adult" : "Minor";  // "Adult"
  • 空合并操作符: 语法:x ?? y,若 xnull 则返回 y。 示例:

    1
    2
    
    string name = null;
    string displayName = name ?? "Unknown";  // "Unknown"
  • 成员访问操作符. 用于访问对象的成员。 示例:

    1
    
    string length = "hello".Length;  // 5
  • 索引操作符[] 用于访问数组或集合中的元素。 示例:

    1
    2
    
    int[] numbers = {1, 2, 3};
    int first = numbers[0];  // 1

1.9 特殊操作符

C# 还提供了一些其他特殊用途的操作符。

操作符 描述 示例
is 检查对象是否为特定类型 if (obj is string)
as 执行引用转换,如果失败则返回 null string s = obj as string;
new 创建新对象或调用构造函数 MyClass obj = new MyClass();
sizeof 获取类型在内存中的大小(以字节为单位) sizeof(int)
typeof 获取指定类型的 System.Type 对象 Type t = typeof(string);

1.10 操作符优先级和结合性

当一个表达式中包含多个操作符时,优先级决定了操作符的执行顺序。结合性则用于处理优先级相同的操作符,决定是从左到右还是从右到左进行计算。

  • 优先级
    • 乘法 (*) 和除法 (/) 的优先级高于加法 (+) 和减法 (-)。
    • 赋值操作符的优先级通常最低。
    • 你可以使用括号 () 来强制改变运算顺序。

示例:

1
2
int result = 5 + 3 * 2; // 结果为 11,因为先计算 3 * 2
int resultWithParentheses = (5 + 3) * 2; // 结果为 16,因为先计算括号中的 5 + 3
  • 结合性
    • 大多数二元操作符(如 +, -, *, /)是左结合的,即从左到右计算。
    • 赋值操作符(如 =) 和三元操作符 ?:右结合的,即从右到左计算。

2. 控制流程

控制流程是决定程序执行顺序的关键。它允许你根据不同的条件执行不同的代码块,或者重复执行某段代码,是编写任何复杂程序的基石。C#主要有三大类控制流程语句:条件语句循环语句跳转语句

2.1 条件语句 (Conditional Statements)

条件语句用于根据某个布尔表达式的结果来决定执行哪个代码块。

if-else 语句

这是最基本的条件语句,用于在条件为 truefalse 时执行不同的代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
int age = 20;

if (age >= 18)
{
    Console.WriteLine("你已成年。");
}
else
{
    Console.WriteLine("你未成年。");
}

你可以使用 else if 来处理多个条件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
int score = 85;

if (score >= 90)
{
    Console.WriteLine("优秀");
}
else if (score >= 80)
{
    Console.WriteLine("良好");
}
else if (score >= 60)
{
    Console.WriteLine("及格");
}
else
{
    Console.WriteLine("不及格");
}

switch 语句

当你有多个针对同一变量的等值比较时,switch 语句比多个 if-else if 语句更简洁、更易读。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
string day = "Monday";

switch (day)
{
    case "Monday":
    case "Tuesday":
    case "Wednesday":
    case "Thursday":
    case "Friday":
        Console.WriteLine("工作日");
        break;
    case "Saturday":
    case "Sunday":
        Console.WriteLine("周末");
        break;
    default:
        Console.WriteLine("无效的输入");
        break;
}

注意:每个 case 块末尾通常需要 break 语句来跳出 switch,除非你想要执行下一个 case(C# 7.0 以后,可以使用 goto case)。

2.2 循环语句 (Looping Statements)

循环语句用于重复执行一段代码,直到满足特定条件为止。

for 循环

for 循环适用于已知循环次数的情况。它由三个部分组成:初始化表达式、条件表达式和迭代表达式。

1
2
3
4
5
// 打印 1 到 5
for (int i = 1; i <= 5; i++)
{
    Console.WriteLine(i);
}

while 循环

while 循环在每次迭代前检查条件。只要条件为 true,循环就会继续。

1
2
3
4
5
6
int i = 1;
while (i <= 5)
{
    Console.WriteLine(i);
    i++;
}

注意:在使用 while 循环时,务必确保循环体内部有改变条件的逻辑,否则可能导致无限循环。

do-while 循环

do-while 循环和 while 循环类似,但它至少会执行一次循环体,因为条件是在循环体执行之后才检查。

1
2
3
4
5
6
int i = 1;
do
{
    Console.WriteLine(i);
    i++;
} while (i <= 5);

foreach 循环

foreach 循环专门用于遍历集合或数组中的所有元素,语法简洁且安全。

1
2
3
4
5
6
string[] fruits = { "Apple", "Banana", "Cherry" };

foreach (string fruit in fruits)
{
    Console.WriteLine(fruit);
}

3. 跳转语句 (Jump Statements)

跳转语句用于改变程序执行的正常流程。

break 语句

break 语句用于立即终止当前循环(forwhiledo-whileforeach)或 switch 语句的执行。

1
2
3
4
5
6
7
8
for (int i = 1; i <= 10; i++)
{
    if (i == 5)
    {
        break; // 当 i 等于 5 时,跳出循环
    }
    Console.WriteLine(i); // 只会打印 1, 2, 3, 4
}

continue 语句

continue 语句用于跳过当前循环迭代中剩余的代码,并开始下一次迭代。

1
2
3
4
5
6
7
8
for (int i = 1; i <= 5; i++)
{
    if (i == 3)
    {
        continue; // 当 i 等于 3 时,跳过当前迭代
    }
    Console.WriteLine(i); // 会打印 1, 2, 4, 5
}

return 语句

return 语句用于从方法中返回,并可以选择性地返回一个值。它会终止方法的执行,并将控制权返回给调用者。

1
2
3
4
int Add(int a, int b)
{
    return a + b; // 返回两个数的和
}

goto 语句

goto 语句用于无条件地跳转到程序中的一个指定标签。虽然 C# 支持 goto,但它的使用通常不被推荐,因为它可能导致代码难以理解和维护。在现代编程实践中,通常有更好的替代方案,如使用 breakcontinue 或重构代码。

1
2
3
4
5
6
7
// 不推荐的用法
goto MyLabel;

Console.WriteLine("这行代码永远不会被执行");

MyLabel:
Console.WriteLine("程序跳转到了这里");
0%