考虑下述情形:要根据变量var是否小于10,来确定是否执行代码。为此,需要确定语句"var小于10"的真假(小于为真,既true;不小于则为假,既false),即需要知道比较的布尔结果
布尔比较需要使用布尔比较运算符(也称为关系运算符),如下表所示。这里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 |
在代码中,可以对数值使用这些运算符,如下所示:
int a = 10, b = 11;
bool var9 = a > b; //值为false
如果变量a的值大于变量b的值,这段代码就给变量var9赋予true值,否则赋予false值。
也可以对其他类型使用这些比较运算符,例如字符串:
string name = "天轰穿";
bool var10 = name == "老田"; //值为false
bool var11 = name != "老田";
如果name存储的字符串是"老田",var10的值就为true。在本例中,name的值是"天轰穿",不等于"老田",所以本例的值为false;猜猜var11的值应该是什么?
也可以对布尔值使用这些运算符:
bool var12=false, var13;
var13 = var12 == true; //值为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 var14 = false, var15, var16 = false, var17 = true, var18, var19,var20;
var15 = !var14; //值为true
var18 = var16 & var17; //值为false
//完全用表达式作为对比条件
var19 = 10 > 5 & 7 < 4; //这里&号两边用的是表达式而不是单独的值,猜下值为多少
string str5 = "天轰穿", str6 = "老田";//申明两个字符串类型变量,下面用来做比较
int sum1 = 10, sum2 = 20; //申明两个INT类型变量,下面用来做比较
var20 = str5 != str6 & sum1 >= sum2; //值为false
Console.WriteLine("var15={0},var18={1},var19={2},var20={3}"
, var15, var18,var19,var20);
&和 | 运算符也有两个类似的运算符,称为条件布尔运算符,如下表。
运算符 | 类别 | 示例表达式 | 结果 |
&& | 二元 | var1 = var2 && var3; | 如果var2和var3都是true,var1的值就是true,否则为false (逻辑与) |
|| | 二元 | var1 = var2 || var3; | 如果var2或var3是true(或两者都是),var1的值就是true,否则为false (逻辑或) |
这些运算符的结果与&和 | 完全相同,但得到结果的方式有一个重要区别:其性能比较好。两者都是检查第一个操作数的值(或者表达式产生的值),再根据该操作数的值进行操作,可能根本就不需要第二个操作数的值。
如果&&运算符的第一个操作数是false,就不需要考虑第二个操作数的值了,因为无论第二个操作数的值是什么,其结果都是false。同样,如果第一个操作数是true,|| 运算符就返回true,无需考虑第二个操作数的值。但上面的&和 | 运算符却不是这样。它们的操作数总是要计算的。
因为操作数的计算是有条件的,如果使用&&和||运算符来代替&和 | ,性能会有一定的提高。在大量使用这些运算符的应用程序中是比较明显的。作为一个规则,尽可能使用&&和 || 运算符。这些运算符有时用于比较复杂的情形,例如,只有第一个操作数包含某个值时,才计算第二个操作数:
var1 = (var2 != 0) && (var3 / var2 > 2);
如果var2是0,则var3除以var2就会导致"除0错误",或者把var1定义为无穷大(对于某些类型如float来说,后者是可能的,也是可以检测到的)。
小天:既然&&和||的效率更高,上面为什么会详细讲&和 | 运算符。
老田:是因为这两种运算符都可以用于对数值执行操作,另外用法都基本一样,所以就选一个讲详细点了。另外,&和 | 最重要的在于它们处理存储在变量中的一系列位,而不是变量的值。
由于位运算对很多初学者来说,很容易晕头转向,同时,该知识点也并不妨碍我们对后面的知识的学习(这里不是说位运算没有用)。所以有兴趣的朋友可以去参考MSDN的数据。
本文为天轰穿原著,转载请注明出处及作者!