现代C:概念剖析和编程实践
上QQ阅读APP看书,第一时间看更新

4.3 布尔情景

根据某些条件是否得到了验证,一些运算符会产生值01。见表4.1。它们可以分为两类:比较和逻辑计算。

4.3.1 比较

在我们的示例中,我们已经看到了比较运算符==!=<>。后两个在其操作数之间执行严格的比较,而<=>=分别执行“小于或等于”和“大于或等于”比较。正如我们已经看到的,所有这些运算符都可以用于控制语句,但是它们实际上比这个更强大。

要点4.13 比较运算符返回值falsetrue

请记住,falsetrue只是分别表示01的花哨的名称。因此,它们可以用于算术或数组索引。在下面的代码中,c始终为1,如果ab相等,则d1,否则为0

050-02

在下一个示例中,数组元素sign[false]将保存largeA中大于或等于1.0的值的个数,而sign[true]则保存小于1.0的值的个数:

051-01

最后,还有一个标识符not_eq,可以用来代替!=。这个特性很少使用。它可以追溯到一些字符不能在所有计算机平台上正确显示的时代。要想使用它,必须包含文件iso646.h

4.3.2 逻辑

逻辑运算符对已经表示为falsetrue的值进行操作。如果它们不存在,则首先应用条件执行的规则(要点3.1)。运算符!)在逻辑上对操作数进行非操作,运算符&&)是逻辑与,而运算符||)是逻辑或。表4.4汇总了这些运算符的结果。

表4.4 逻辑运算符

051-02

类似于比较运算符。

要点4.14 逻辑运算符返回值falsetrue

同样,请记住这些值仅仅是01,因此可以用作索引:

051-03

这里,表达!!largeA[i]使用了!运算符两次,从而确保largeA[i]被赋值为truth值(要点3.4)。因此,数组元素isset[0]isset[1]将分别保存等于0.0和不等于的值的个数。

052-01

运算符&&||有一个特殊的特性,称为短路计算C。这个野蛮的术语表示这样一个事实,如果第二个操作数对操作结果不是必需的,那么对它的计算可以省略:

052-02

这里,在执行过程中有条件地省略a/b的计算,可以永远不会发生除0的情况。等效的代码是

052-03