购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.1
布尔值

要在C语言中提出一个问题,通常需要比较两个(或多个)事物。C语言中有几个运算符就是用来完成这项任务的。你可以检查两个事物是否相同,也可以查看某个值是否小于或大于另一个值。

当你提出“ x 是否与 y 相同”这样的问题时,你会得到“是”或“否”、“真”或“假”的答案。在计算机科学中,这些值被称为布尔值,以乔治·布尔(George Boole)的名字命名,他致力于将逻辑运算和结果系统正规化。有些语言有布尔值和变量的实际类型,但C语言大多使用整数:0表示假/否,1表示真/是 [1]

从技术上讲,C中任何不是0的值都是真值,所以1为真、2为真、-18为真,等等。无论何时,我都会指出我进行的检查依赖于这一事实。这样做可能会很方便,而且你肯定会在现实世界中看到它的应用,但我会集中精力在任何地方进行显式比较。

3.1.1 比较运算符

当然,数学并不是计算机唯一擅长的事情。当我们开始编写更复杂的程序时,我们需要具备对系统状态做出决策的能力。我们需要将变量与期望值进行比较,并防止出现错误。我们需要检测列表和其他数据结构的结束。令人欣慰的是,C语言的比较运算符可以满足所有这些要求。

C语言定义了6个运算符(如表3-1所示),可用于比较数值。我们使用这些运算符的方式与使用表2-6中的数学运算符一样。左边是变量、值或表达式,右边是运算符和变量、值或表达式。不同的是,使用比较运算符的结果始终是布尔型int,即始终是1或0。

表3-1:比较运算符

在C语言中,比较运算符适用于字符、整数和浮点数。有些语言支持对更复杂的数据位[如数组(将在第4章中介绍)、记录或对象]进行运算的运算符,但C语言使用函数(将在第5章中介绍)来进行此类运算。

在比较两个相同类型的表达式时,可以使用表3-1中的运算符,而无须仔细考虑。如果比较不同类型的表达式,例如float变量和int值,隐式转换的概念同样适用(见图2-4),具有“较低”类型的值将在比较前被提升。

我们稍后将在“分支”和“循环语句”中使用这些比较运算符,但我们可以绕个弯,用一些简单的打印语句来显示0或1的结果。请看 ch03/booleans.c

继续编译并运行该文件。你应该会看到类似下面的输出:

从这里可以看出,“true”比较的结果是1,这一点我在前面提到过。反之,“false”在后台的结果是0。

3.1.2 逻辑运算符

我们在代码中要问的一些问题无法简化为单一的比较。例如,一个非常流行的问题是询问变量是否在某个取值范围内。我们需要知道相关变量是否既大于某个最小值,又小于某个最大值。C语言没有创建范围或测试是否属于此类范围的运算符。但C语言支持逻辑运算符(有时你会听到布尔运算符),可以帮助你建立可能相当复杂的逻辑表达式。

要开始操作,请查看表3-2中的运算符。

表3-2:布尔运算符

这些运算符看起来可能有点奇怪,而且你可能对逻辑运算不太熟悉,所以请给自己一些时间来理解这些符号。如果还不太习惯,也不用担心。你肯定会在网上的代码中遇到这些运算符,所以让我们来确保你了解它们是如何工作的。

在讨论编程语言时,称其为“逻辑”或“布尔代数”是有用的,但你可能已经从人类语言(比如我在这里使用的英语)中了解了这些概念:这些运算符构成了连接词。语法课上的“and”“but”和“or”大致相当于C语言中的&&、!和||。考虑一下“x>0 && x<100”。大声读出这个表达式:“x大于0且x小于100”。如果拼写出这些表达式对你有帮助,那么在遇到新代码时,你就可以轻松使用这个技巧了。

在逻辑学中,这些运算符最好用它们的结果来描述。反过来,这些结果也常常显示在真值表中,真值表列举了所有可能的输入组合及其结果。幸运的是,由于只有真和假两种可能的值,这些组合是可以管理的。每个运算符都有自己的真值表。表3-3列出了&&运算符的输入和结果。让我们从这里开始。

表3-3:&&(与)运算符

如表3-3所示,这是一个限制性相当强的运算符。两个输入都必须为真,结果才会为真。根据前面的提示,从英语连词的角度来思考可能会有帮助:“在Reg和Kaori都准备好之前,我们不能去参加聚会。”如果Reg还没准备好,我们就得等。如果Reg准备好了,但Kaori还没准备好,我们也得等。当然,如果两个人都没准备好,我们也要等 。只有两个人都准备好了,我们才能开始徒步旅行。

表3-4显示了对相同的输入组合使用||时的结果。

表3-4:||(或)运算符

这是一个更加宽容的操作符。回到我们的聚会旅行比喻,也许这天正好是周末,我们不能指望两个朋友都能放下一切事情来参加。在这个变式中,如果Reg或Kaori都能参加,那么我们就能和一个好的晚餐伙伴共度美好时光。与&&运算符类似,如果两个人都能加入,那就太好了!我们仍然可以度过一个愉快的夜晚 。但如果两个输入都是假,那么总答案还是假,我们就只能靠自己了。

C语言支持用于构建逻辑表达式的最后一个运算符是!。它是一个一元运算符:只对一件事进行运算,而不是像数学运算符或比较运算符那样需要对两件事情进行二元运算。这意味着它的表格(表3-5)要简单一些。

表3-5:!(非)运算符

在编码中,这种“not”操作通常用于在继续编码之前防止出现错误。我们的最后一个聚会示例:只要不遇到交通堵塞,我们就会准时到达聚会地点。这个运算符会产生相反的结果。因此,“堵车是坏事”与“不堵车是好事”是相反的。转换成语言表达后就不那么直截了当了,但希望仍能说明一点,即你可以谈论正在执行的逻辑。 TOEc9KfMcRnnXSOYx+TpIvFTVwywUiazJdyaRrvn7gUtlvcssKxuuD0Rg06ZBqwv

点击中间区域
呼出菜单
上一章
目录
下一章
×