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

3.1 条件执行

我们将看到的第一个结构由关键字if指定。看起来是这样的:

035-01

这里我们将i与值25进行比较。如果它大于25,则j设置为i - 25。在本例中,i > 25被称为控制表达式C{ ... }中的部分被称为依赖块C

表面上看,if语句的这种形式类似于我们已经遇到的for语句。但它的工作方式不同:圆括号中只有一个部分,它决定了依赖语句或块是否只执行一次或根本不执行。

if结构还有一种更普遍的形式:

036-01

它有第二个依赖语句或块,如果未满足控制条件,则执行它们。从语法上讲,这是通过引入另一个关键字else来实现的,else将两个语句或块分隔开。

if (...) ... else ...是一个选择语句C。它根据( ... )的内容从两个可能的代码路径C中选择一个。一般形式是

036-02

condition(控制表达式)的可能性很多。它们可以从简单的比较(如本例中所示)到非常复杂的嵌套表达式。我们将在4.3.2节中介绍所有可以使用的原始用语。

if语句中最简单的condition规范可以在下面的示例中看到,它是清单1.1中for循环的一个变体:

036-03

这里决定printf是否执行的条件是i:一个数值,其本身可以解释为一个条件。只有当i的值不为0时,才会打印文本[练习1]

计算数值condition有两个简单的规则:

要点3.1 值0表示逻辑为假。

要点3.2 任何不是0的值都表示逻辑为真。

运算符==!=允许我们分别测试等式和不等式。如果a的值等于b的值,则a == b为真,否则为假。如果a等于b,则a != b为假,否则为真。知道数值是如何作为条件计算的,我们可以避免冗余。例如,我们可以将

037-01

重写为:

037-02

这两个版本中哪一个更具可读性是一个编码风格C的问题,可能会引起毫无结果的争论。虽然对于偶尔阅读C代码的人来说,前者可能更容易阅读,但在假定对C的类型系统有一定了解的情况,后者通常是首选。

stdbool.h中指定的bool类型是我们要存储真值时应该使用的类型。它的值有falsetrue。从技术上讲,false0的另一个名称,而true1的另一个名称。重要的是,使用falsetrue(而不是数字)来强调某个值被解释为一个条件。我们将在5.7.4节中了解更多关于bool类型的信息。

冗余比较很快就变得不可读,并使代码变得混乱。如果你有一个依赖于真值的条件,那么就直接使用这个真值作为条件。同样,我们可以通过重写来避免冗余,将

037-03

写为

037-04

一般情况下:

要点3.3 不要与0falsetrue进行比较。

直接使用真值使你的代码更清晰,这展示了C语言的一个基本概念:

要点3.4 所有标量都有一个真值。

这里,标量C类型包括我们已经遇到的所有数值类型,如size_tboolint,以及指针C类型。表3.1中列出了本书中经常使用的类型。我们将在6.2节中讨论它们。

表3.1 本书中使用的标量类型

038-01

[练习1]if (i)条件添加到程序中,并将输出与之前进行比较。