C#操作符和控制流程
1.操作符
1.1 概述
操作符是用于执行特定操作的符号,例如算术、比较、逻辑等。根据操作数的数量,操作符可以分为:
- 一元操作符:作用于一个操作数,如
-x
(取反)。 - 二元操作符:作用于两个操作数,如
x + y
。 - 三元操作符:作用于三个操作数,如条件操作符
condition ? true_value : false_value
。
2.1 算术操作符
算术操作符用于执行基本的数学计算,适用于数值类型(如 int
、double
等)。
操作符 | 功能 | 示例 | 注意事项 |
---|---|---|---|
+ |
加法/字符串拼接 | 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 |
前缀先运算后返回值,后缀反之 |
示例代码:
|
|
注意:
- 自增和自减操作符有前置(
++x
)和后置(x++
)之分。前置先执行操作再返回值,后置先返回值再执行操作。
1.3 赋值操作符
赋值操作符用于将值赋给变量,常见的包括简单赋值和复合赋值。
操作符 | 描述 | 示例 |
---|---|---|
= |
简单赋值 | x = y |
+= |
加法赋值 | x += y |
-= |
减法赋值 | x -= y |
*= |
乘法赋值 | x *= y |
/= |
除法赋值 | x /= y |
%= |
取模赋值 | x %= y |
示例代码:
|
|
说明:
- 复合赋值操作符简化了代码,特别是在需要对变量进行多次修改时。
1.4 比较操作符
比较操作符用于比较两个值,返回布尔值(true
或 false
),常用于条件判断。
操作符 | 功能 | 示例 | 比较规则 |
---|---|---|---|
== /!= |
相等/不等 | "abc" == "abc"; // true |
字符串比较内容,引用类型比较地址(除string ) |
> /< |
大于/小于 | 5 > 3; // true |
字符比较Unicode码值 |
>= /<= |
大于等于/小于等于 | 4.5 <= 4.5; // true |
浮点数比较需考虑精度误差 |
示例代码:
|
|
注意:
- 比较操作符常与控制流程语句(如
if
)结合使用。
1.5 逻辑操作符
逻辑操作符用于组合布尔表达式,常见于复杂条件判断。
操作符 | 名称 | 描述 |
---|---|---|
&& |
逻辑与 | x && y |
` | ` | |
! |
逻辑非 | !x |
示例代码:
|
|
说明:
- 逻辑操作符具有短路求值特性:
&&
在左侧为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.7 其他操作符
C#还包括一些特殊操作符,增强了代码的表达能力。
-
条件操作符(三元操作符): 语法:
condition ? true_expression : false_expression
示例:1 2
int age = 20; string status = (age >= 18) ? "Adult" : "Minor"; // "Adult"
-
空合并操作符: 语法:
x ?? y
,若x
为null
则返回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 操作符优先级和结合性
当一个表达式中包含多个操作符时,优先级决定了操作符的执行顺序。结合性则用于处理优先级相同的操作符,决定是从左到右还是从右到左进行计算。
- 优先级:
- 乘法 (
*
) 和除法 (/
) 的优先级高于加法 (+
) 和减法 (-
)。 - 赋值操作符的优先级通常最低。
- 你可以使用括号
()
来强制改变运算顺序。
- 乘法 (
示例:
|
|
- 结合性:
- 大多数二元操作符(如
+
,-
,*
,/
)是左结合的,即从左到右计算。 - 赋值操作符(如
=
) 和三元操作符?:
是右结合的,即从右到左计算。
- 大多数二元操作符(如
2. 控制流程
控制流程是决定程序执行顺序的关键。它允许你根据不同的条件执行不同的代码块,或者重复执行某段代码,是编写任何复杂程序的基石。C#主要有三大类控制流程语句:条件语句、循环语句和跳转语句。
2.1 条件语句 (Conditional Statements)
条件语句用于根据某个布尔表达式的结果来决定执行哪个代码块。
if-else
语句
这是最基本的条件语句,用于在条件为 true
或 false
时执行不同的代码。
|
|
你可以使用 else if
来处理多个条件:
|
|
switch
语句
当你有多个针对同一变量的等值比较时,switch
语句比多个 if-else if
语句更简洁、更易读。
|
|
注意:每个 case
块末尾通常需要 break
语句来跳出 switch
,除非你想要执行下一个 case
(C# 7.0 以后,可以使用 goto case
)。
2.2 循环语句 (Looping Statements)
循环语句用于重复执行一段代码,直到满足特定条件为止。
for
循环
for
循环适用于已知循环次数的情况。它由三个部分组成:初始化表达式、条件表达式和迭代表达式。
|
|
while
循环
while
循环在每次迭代前检查条件。只要条件为 true
,循环就会继续。
|
|
注意:在使用 while
循环时,务必确保循环体内部有改变条件的逻辑,否则可能导致无限循环。
do-while
循环
do-while
循环和 while
循环类似,但它至少会执行一次循环体,因为条件是在循环体执行之后才检查。
|
|
foreach
循环
foreach
循环专门用于遍历集合或数组中的所有元素,语法简洁且安全。
|
|
3. 跳转语句 (Jump Statements)
跳转语句用于改变程序执行的正常流程。
break
语句
break
语句用于立即终止当前循环(for
、while
、do-while
、foreach
)或 switch
语句的执行。
|
|
continue
语句
continue
语句用于跳过当前循环迭代中剩余的代码,并开始下一次迭代。
|
|
return
语句
return
语句用于从方法中返回,并可以选择性地返回一个值。它会终止方法的执行,并将控制权返回给调用者。
|
|
goto
语句
goto
语句用于无条件地跳转到程序中的一个指定标签。虽然 C# 支持 goto
,但它的使用通常不被推荐,因为它可能导致代码难以理解和维护。在现代编程实践中,通常有更好的替代方案,如使用 break
、continue
或重构代码。
|
|