跳至内容
Topos Uranos

摘要

条件是值为真或假的表达式。本课研究条件在 C++ 中如何构造:六个关系运算符,它们比较两个值并产生一个 bool;三个逻辑联结词 &&、|| 和 !,它们像逻辑中的合取、析取和否定那样组合条件;以及决定它们彼此之间、它们与算术运算之间次序的优先级。本课还研究 C++ 偏离数学写法的两个特点:链式写法 1 < x < 5,它能编译,却不是看上去的意思;以及短路求值,即当 && 和 || 的第一个操作数已经决定结果时,第二个操作数不求值,这使得我们可以保护一个危险的运算。最后讲用德摩根律对复合条件取反,并用真值表加以验证,以及本课的核心例子:闰年条件及其否定。本单元还没有判断语句:条件只被求值并打印为 true 或 false,判断一课将让它们控制程序。

学习目标

  1. 在 C++ 中写出复合条件,翻译诸如“xx 在 1 和 10 之间,含端点”这样的陈述。
  2. 用德摩根律对复合条件取反,并用真值表验证等价性。
  3. 利用短路求值保护一个运算,如 count != 0 && total / count > 2。
  4. 识别写成 1 < x < 5 的错误,说明它计算的是什么,并加以改正。

作为表达式的条件

字符、布尔值、类型转换与常量一课介绍了 bool 类型及其两个值 true 和 false,算术运算一课说明了表达式有一棵树,由优先级和结合性决定,还有一个类型,由它的操作数决定。本课把这两个想法结合起来。条件是类型为 bool 的表达式:它不是提出某个问题的语句,而是一个结果就是答案的计算。count < 10 的计算方式与 count + 1 相同:取操作数,应用运算符,得到一个值,只不过这个值是 true 或 false,而不是一个数。若是如此,凡对算术表达式成立的,对条件也成立:条件有优先级,有树,可以保存在一个有名字的变量中(const bool inRange{…}),也可以打印。由此引出贯穿本课的问题:给定一句话(“这一年是闰年”,“年龄在 18 到 65 之间”),哪个表达式对所有可能的数据都恰好具有这句话的真值?