布尔运算
到目前为止,你已经见过了if
语句,它检查一个条件是否为真。如果我们想要检查多个条件?或检查一个条件非真呢?
&&检查两个条件都为真
只有当给出的两个条件同时为真时,与运算(&&
)的结果才为真。
与运算的效率很高,因为如果第一个条件为假,计算机就不会自寻烦恼地去计算第二个条件,因为它知道如果第一个条件为假,那么整个条件也一定为假。
||检查两个条件中只要有一个为真
两个条件中只要有一个为真时,或运算(||
)的结果就是真。
如果第一个条件为真,计算机就不会自找麻烦地去计算第二个条件,因为它知道只要第一个条件为真,整个条件也一定为真。
!把条件的值反过来
!
是非运算,它将一个条件的值取反。
百宝箱
在 C 语言中,布尔值是用数字表示的。对 C 语言来讲,数字 0 代表假的值。那什么数字代表真呢?任何不等于0的数字都将被当成真处理,因此下面的C代码也没错:
- int people_moshing = 34;
- if (people_moshing)
- take_off_glasses();
事实上,C 程序常用它作为“检查某个变量不为0”的简写。
练习
为了让程序能用来算牌,请做一些修改。如果牌的点数在3到6之间,程序需要显示一条消息;如果牌是10、J、Q或K,则需要显示不同消息。
C标准礼貌指南
ANSI C标准没有用来表示真和假的值,C程序把0这个值当做假处理,把0以外的任何值当做真处理。C99标准则允许在程序中使用true和false关键字。但编译器还是会把它们当做1和0这两个值来处理。
练习解答
为了让程序能用来算牌,请做一些修改。如果牌的点数在3到6之间,程序需要显示一条消息;如果牌是10、J、Q或K,则需要显示不同消息。
这里没有蠢问题
问:为什么不能只写一个
|
和&
?答:也不是不行。
&
和|
操作符总是计算两个条件,而&&
和||
可以跳过第二个条件。问:那还要
|
和&
干什么呢?答:对逻辑表达式求值只是它们的一个用处,它们还能对数字的某一位进行布尔运算。
问:那是什么意思?
答:6
&
4等于 4,是因为当对6(二进制数110)和4(二进制数100)的每个二进制位布尔与时,就会得到4(二进制数100)。
试驾
现在编译并运行程序,看看会发生什么:
代码正确运行。通过布尔运算符将多个条件组合在一起,就可以检查取值是否在某个范围内,而不仅仅是一个值。现在算牌器已经初具雏形。
编译器大曝光
本周访谈:gcc的奉献
Head First:gcc
,非常谢谢您在百忙之中抽出时间接受我们的采访。
gcc:小事一桩,很高兴能参加你们的节目。
Head First:gcc
,听说你会说很多种语言,是真的吗?
gcc:我熟练地掌握了600多万种沟通方式……
Head First:真的假的?
gcc:呵呵,开玩笑啦,不过我的确会说很多种语言,除了C语言,我还会C++和Objective-C,对Pascal、Fortran和PL/I等语言也有一定研究,Go语言我也略知一二……
Head First:在硬件方面,听说你可以生成很多平台的机器代码?
gcc:几乎任何处理器。一般而言,每当硬件工程师新创造了一种处理器,他要做的第一件事情就是让我在上面运行。
Head First:这种灵活性简直不可思议,请问你是怎么办到的呢?
gcc:我的秘诀就是拥有双重性格。我有一个前端,这个部分的我可以理解某种类型的源代码。
Head First:比如用C语言写的源代码?
gcc:没错,我的前端能够将这种语言转化为一种中间代码,所有的语言前端都能够生成同一种代码。
Head First:那么另外一种性格呢?
gcc:我还有一个后端,一个将中间代码转化为多种平台的机器代码的系统。每种操作系统都有自己特定的可执行文件格式,但我都知道……
Head First:可是人们通常仅仅将你描述为翻译器,你认为这公平吗?毕竟翻译不是你的全部。
gcc:是的,除了简单的翻译之外我还干很多事情,例如我会发现代码中的错误。
Head First:能举些例子吗?
gcc:我能够检查明显的错误,例如变量名拼错了;我也能找到不容易发现的错误,例如变量的重复定义;当程序员用已经存在的函数名去命名变量时,我也会发出警告,等等。
Head First:也就是说你会检查代码的质量?
gcc:没错,不仅仅是质量,还有性能。如果我发现循环中的某段代码提到循环外面执行时也一样正确,我会默默移动它。
Head First:你真的干了很多活!
gcc:是的,但我一向低调行事。
Head First:gcc
,谢谢你接受我们的采访。
变身编译器
这页上的每个C文件都代表一个完整的源文件。你的工作是扮演编译器,并决定它们能否编译成功。如果不能,说明原因。如果你想得到附加分,说明程序编译以后的运行结果,以及它们是否能按预期工作。
变身编译器解答
这页上的每个C文件都代表一个完整的源文件。你的工作是扮演编译器,并决定它们能否编译成功。如果不能,说明原因。如果你想得到附加分,说明程序编译以后的运行结果,以及它们是否能按预期工作。