布尔运算
到目前为止,你已经见过了
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 文件都代表一个完整的源文件。你的工作是扮演编译器,并决定它们能否编译成功。如果不能,说明原因。如果你想得到附加分,说明程序编译以后的运行结果,以及它们是否能按预期工作。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论