程序流程就是C#代码的执行顺序。控制程序流程的两种方法是:分支和循环。分支根据计算的结果有条件的执行代码。循环重复执行相同的语句。这两种方法都用到了布尔逻辑。
1 布尔逻辑
布尔逻辑使用布尔值(true或false)计算条件。
bool类型可以有两个值:true或false。bool类型可用于存储比较的结果。布尔比较需要使用布尔比较运算符(也称为关系运算符)。
布尔比较运算符
运算符 | 类别 | 示例表达式 | 结果 |
== | 二元 | var1 = var2 == var3; | 如果var2等于var3,var1的值就是true,否则为false |
!= | 二元 | var1 = var2 != var3; | 如果var2不等于var3,var1的值就是true,否则为false |
< | 二元 | var1 = var2 < var3; | 如果var2小于var3,var1的值就是true,否则为false |
> | 二元 | var1 = var2 > var3; | 如果var2大于var3,var1的值就是true,否则为false |
<= | 二元 | var1 = var2 <= var3; | 如果var2小于或等于var3,var1的值就是true,否则为false |
>= | 二元 | var1 = var2 >= var3; | 如果var2大于或等于var3,var1的值就是true,否则为false |
在上表中,var1都是bool类型的变量,var2和var3则可以是不同类型,如数值、字符串、布尔值。
对布尔值使用这些运算符,只能使用==和!=运算符。
&和|运算符也有两个类似的运算符,称为条件布尔运算符。
条件布尔运算符
运算符 | 类别 | 示例表达式 | 结果 |
&& | 二元 | var1 = var2 && var3; | 如果var2和var3都是true,var1的值就是true,否则为false.(逻辑与) |
|| | 二元 | var1 = var2 || var3; | 如果var2或var3是true(或两者都是),var1的值就是true,否则为false.(逻辑或) |
&& 和 || 运算符的结果与 & 和 | 完全相同,但性能更好。检查第一个操作数的值(var2),如果已经能判断结果,就根本不必处理第二个操作数(var3)。
1.1 布尔按位运算符和赋值运算符
布尔赋值运算符可以把布尔比较与赋值组合起来。当表达式使用赋值(=)和按位运算符(&、|、^)时,就使用所比较数值的二进制表示来计算结果,而不是整数、字符串或相似的值。
布尔赋值运算符
运算符 | 类别 | 示例表达式 | 结果 |
&= | 二元 | var1 &= var2; | var1的值就是var1 & var2的值 |
|= | 二元 | var1 |= var2; | var1的值就是var1 | var2的值 |
^= | 二元 | var1 ^= var2; | var1的值就是var1 ^ var2的值 |
^运算符(逻辑异或)用法:如果操作数中相同位置上的位有且只有一个为1,其结果位就是1。
例如,var1 ^= var2类似于var1 = var1 ^ var2,其中var1 = true,var2 = false。当比较false的二进制表示0000与true的二进制表示0001时,var1 就设置为true。
1.2 运算符优先级
运算符优先级(更新后)
优先级 | 运算符 |
优先级由高到低 | ++,--(用作前缀),(),+,-(一元),!,~(按位取反) *,/,% +,- <<,>> <,>,<=,>= ==,!= & ^ | && || =,*=,/=,%=,+=,-=,<<=,>>=,&=,^=,= ++,--(用作后缀) |
2 分支
分支是控制下一步要执行哪行代码的过程。由条件语句来控制,这个条件语句使用布尔逻辑。(使用布尔逻辑控制程序流)
C#中的3种分支技术:
- 三元运算符
- if语句
- switch语句
2.1 三元运算符
三元运算符有三个操作数,其语法如下:
<test>?<resultIfTrue>:<resultIfFalse>
计算test可得到一个布尔值,运算符的结果根据这个值来确定是<resultIfTrue>还是<resultIfFalse>。
2.2 if语句
if语句是一种有效的决策方式。与?:语句不同,if语句的结果不能赋给一个变量,使用该语句是为了根据条件执行其他语句。最简单的语法如下:
if(<test>)
{<code executed if <test> is true>;}
else
{<code executed if <test> is false>;}
2.3 switch语句
switch语句非常类似于if语句,也是根据测试的值来有条件的执行代码。但是,Switch语句可以一次将测试变量与多个值进行比较,而不是仅测试一个条件。这种测试仅限于离散的值。
switch语句的基本结构如下:
switch(<testVar>)
{
case<comparisonval1>:
<code to execute if <testVar> == <comparisonval1> >
<break>;
case<comparisonval2>:
<code to execute if <testVar> == <comparisonval2> >
<break>;
……
case<comparisonvalN>:
<code to execute if <testVar> == <comparisonvalN> >
<break>;
default:
<code to execute if <testVar> != comparisonvals>
<break>;
}
<testVar>的值与每个<comparisonvalX>的值进行比较,如果有一个匹配,就执行为该匹配提供的语句。如果没有匹配,但有default语句,就执行default部分的代码。执行完每个部分的代码之后,还需要另一个语句break。break将中断switch结构的执行。也可以使用return语句,中断当前函数的运行,而不只是switch结构。也可以使用goto语句。
switch(<testVar>)
{
case<comparisonval1>:
<code to execute if <testVar> == <comparisonval1> >
goto case<comparisonval2>;
case<comparisonval2>:
<code to execute if <testVar> == <comparisonval2> >
<break>;
}
一个case语句处理完毕后,不能自由进入下一个case语句。但这条规则有个例外:如果多个case语句堆叠在一起,其后加一个代码块,实际上是一次检查多个条件。满足这些条件中的一个,就会执行代码。
switch(<testVar>)
{
case<comparisonval1>:
case<comparisonval2>:
<code to execute if <testVar> == <comparisonval1> or <testVar> == <comparisonval2> >
<break>;
case<comparisonval2>:
default:
<code to execute>
<break>;
}
3 循环
循环就是重复执行语句。(根据指定的条件多次执行代码块)
3.1 do循环
一直循环到给定的条件满足为止。do循环执行方式:执行标记为循环的代码,然后进行一个布尔测试,如果测试结果为 true,就再次执行这段代码,当测试结果为false时,就退出循环。
do循环的结构如下:
do
{
< code to be looped >
}while(<test>);
3.2 while循环
与do循环的区别:while循环中的布尔测试在循环开始时进行,而不是最后进行。如果测试结果为false,就不会执行循环。
while(<test>)
{
< code to be looped >
}
3.3 for循环
for循环可以指定循环的次数,并维护它自己的计数器。定义for循环,需要下列信息:
- 初始化计数器变量的一个起始值。
- 继续循环的条件,应涉及计数器变量。
- 在每次循环的最后,对计数器变量执行一个操作。
for(<initialization>;<condition>;<operation>)
{
<code to loop>
}
3.4 循环的中断
- break——立即终止循环。
- continue——立即终止当前的循环(继续执行下一次循环)。
- return——跳出循环及包含该循环的函数。
continue仅中断当前迭代,而不是整个循环,例如:
int i;
for(i = 1,i<=10,i++)
{
if( ( i % 2) == 0)
continue;
WriteLine(i);
}
在该示例中,只要i除以2的余数为0,continue语句就终止当前的迭代,所以只显示数字1、3、5、7和9。
3.5 无限循环
永不终止的循环,只能在用户强制中断时结束。
while(true)
{
<code in loop>
}