流程控制-布尔逻辑
到目前为止,我们看到的C#程序的执行都是一行接一行、自上而下的进行,不遗漏任何代码。如果所有的应用程序都这样执行,那我们能揍的工作就太有限了。
这里介绍控制程序流程的两种方法:
1、分支——有条件的执行代码。条件取决于计算的结果,例如“如果myVal小于0”,就只执行这行代码”。
2、循环——重复执行相同的语句(重复执行一定的次数,或者在满足测试条件后停止执行)。
这两种方法都要用到布尔逻辑。前面介绍的bool类型可以有两个值:true或false。这种类型常常用于记录某些操作的结果,以便操作这些结果。bool类型可用于存储比较过的结果。
考虑下述情形:如果根据变量myVal是否小于10,来确定是否执行代码。为此,需要确定语句“myVal小于10”的真假,即需要知道比较的布尔结果。
布尔比较需要使用布尔比较运算符(也称为关系运算符),如下所述。这里var1都是bool类型的变量,var2和var3则可以是各种类型。
==: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。
在代码中,可以对数值使用这些运算符,如下所示:
bool isLessThan10;
isLessThan10 = myVal < 10;
如果myVal存储的值小于10,这段代码就给isLessThan10赋予true值,否则赋予false值。
也可以对其他类型使用这些比较运算符,例如字符串:
bool isKarli;
isKarli = myString == "karli";
如果myString存储的字符串是Karli,isKarli的值就位true,否则为false。
也可以对布尔值使用这些运算符:
bool isTrue;
isTrue = myBool == true;
但只能使用==和!=运算符。
注意:假定var1<var2是false,则var1>var2为true,此时会产生一个错误。如果var1==var2,则两个语句都是false。
在处理布尔值时,还有其他一些布尔运算符,如下所示:
!:var1=!var2;如果var2是false,var1的值就是true,否则为false(逻辑非)。
&:var1=var2&var3;如果var2和var3都是true,var1的值就是true,否则为false(逻辑与)。
|:var1=var2|var3;如果var2或var3是true(或两者都是),var1的值就是true,否则为false(逻辑或)。
^:var1=var2^var3;如果var2或var3中有且只有一个是true,var1的值就是true,否则为false(逻辑异或)。
上面的代码也可以表述为:
bool isTrue;
isTrue = myBool & true;
&和|运算符也有两个类似的运算符,称为条件布尔运算符:
&&:var1=var2&&var3;如果var2和var3都是true,var1的值就是true,否则为false(逻辑与)。
||:var1=var2||var3;如果var2或var3是true(或两者都是),var1的值就是true,否则为false(逻辑或)。
这些运算符的结果与&和|完全相同,但得到结果的方式有一个重要区别:其性能比较好。两者都是检查第一个操作数(var2),再根据该操作数的值进行操作,可能根本就不需要第二个操作数的值(var3)。
如果&&运算符的第一个操作数是false,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是false。同样,如果第一个操作数是true,||运算符就返回true,不必考虑第二个操作数的值。
但上面的&和|条件布尔运算符却不是这样。它们的操作数总是要计算的。
因为操作数的计算是有条件的,如果使用&&和||运算符来代替&和|,性能会有一定的提高。在大量使用这些运算符的应用程序中比较明显的。作为一个规则,尽可能使用&&和||运算符。
注意这些运算符有时候用于比较复杂的情形,例如,只有第一个操作数包含某个值时,才计算第二个操作数:
var1 = (var2 != 0) && (var3 / var2 >2);
如果var2是0,则var3除以var2就会导致“除0错误”,或者把var1定义位无穷大(对于某些类型如float来说,后则是可能的,也是可以检测到)。