布尔运算

到目前为止,你已经见过了if语句,它检查一个条件是否为真。如果我们想要检查多个条件?或检查一个条件非真呢?

&&检查两个条件都为真

只有当给出的两个条件同时为真时,与运算(&&)的结果才为真。

布尔运算 - 图1

与运算的效率很高,因为如果第一个条件为假,计算机就不会自寻烦恼地去计算第二个条件,因为它知道如果第一个条件为假,那么整个条件也一定为假。

||检查两个条件中只要有一个为真

两个条件中只要有一个为真时,或运算(||)的结果就是真。

布尔运算 - 图2

如果第一个条件为真,计算机就不会自找麻烦地去计算第二个条件,因为它知道只要第一个条件为真,整个条件也一定为真。

!把条件的值反过来

!是非运算,它将一个条件的值取反。

布尔运算 - 图3

布尔运算 - 图4百宝箱

在 C 语言中,布尔值是用数字表示的。对 C 语言来讲,数字 0 代表假的值。那什么数字代表真呢?任何不等于0的数字都将被当成真处理,因此下面的C代码也没错:

  1. int people_moshing = 34;
  2. if (people_moshing)
  3. take_off_glasses();

事实上,C 程序常用它作为“检查某个变量不为0”的简写。

 

布尔运算 - 图5练习

为了让程序能用来算牌,请做一些修改。如果牌的点数在3到6之间,程序需要显示一条消息;如果牌是10、J、Q或K,则需要显示不同消息。

布尔运算 - 图6

 

布尔运算 - 图7C标准礼貌指南

ANSI C标准没有用来表示真和假的值,C程序把0这个值当做假处理,把0以外的任何值当做真处理。C99标准则允许在程序中使用true和false关键字。但编译器还是会把它们当做1和0这两个值来处理。

 

布尔运算 - 图8练习解答

为了让程序能用来算牌,请做一些修改。如果牌的点数在3到6之间,程序需要显示一条消息;如果牌是10、J、Q或K,则需要显示不同消息。

布尔运算 - 图9

 

这里没有蠢问题

问:为什么不能只写一个|&

:也不是不行。&|操作符总是计算两个条件,而&&||可以跳过第二个条件。

问:那还要|&干什么呢?

:对逻辑表达式求值只是它们的一个用处,它们还能对数字的某一位进行布尔运算。

问:那是什么意思?

:6 & 4等于 4,是因为当对6(二进制数110)和4(二进制数100)的每个二进制位布尔与时,就会得到4(二进制数100)。

布尔运算 - 图10试驾

现在编译并运行程序,看看会发生什么:

布尔运算 - 图11

代码正确运行。通过布尔运算符将多个条件组合在一起,就可以检查取值是否在某个范围内,而不仅仅是一个值。现在算牌器已经初具雏形。

布尔运算 - 图12

 

布尔运算 - 图13编译器大曝光

本周访谈:gcc的奉献

Head Firstgcc,非常谢谢您在百忙之中抽出时间接受我们的采访。

gcc:小事一桩,很高兴能参加你们的节目。

Head Firstgcc,听说你会说很多种语言,是真的吗?

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 Firstgcc,谢谢你接受我们的采访。

布尔运算 - 图14变身编译器

这页上的每个C文件都代表一个完整的源文件。你的工作是扮演编译器,并决定它们能否编译成功。如果不能,说明原因。如果你想得到附加分,说明程序编译以后的运行结果,以及它们是否能按预期工作。

布尔运算 - 图15

布尔运算 - 图16变身编译器解答

这页上的每个C文件都代表一个完整的源文件。你的工作是扮演编译器,并决定它们能否编译成功。如果不能,说明原因。如果你想得到附加分,说明程序编译以后的运行结果,以及它们是否能按预期工作。

布尔运算 - 图17