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

这里我们将i
与值25
进行比较。如果它大于25
,则j
设置为i - 25
。在本例中,i > 25
被称为控制表达式C,{ ... }
中的部分被称为依赖块C。
表面上看,if
语句的这种形式类似于我们已经遇到的for
语句。但它的工作方式不同:圆括号中只有一个部分,它决定了依赖语句或块是否只执行一次或根本不执行。
if
结构还有一种更普遍的形式:

它有第二个依赖语句或块,如果未满足控制条件,则执行它们。从语法上讲,这是通过引入另一个关键字else
来实现的,else
将两个语句或块分隔开。
if
(...) ...
else
...
是一个选择语句C。它根据( ... )
的内容从两个可能的代码路径C中选择一个。一般形式是

condition
(控制表达式)的可能性很多。它们可以从简单的比较(如本例中所示)到非常复杂的嵌套表达式。我们将在4.3.2节中介绍所有可以使用的原始用语。
if
语句中最简单的condition
规范可以在下面的示例中看到,它是清单1.1中for
循环的一个变体:

这里决定printf
是否执行的条件是i
:一个数值,其本身可以解释为一个条件。只有当i
的值不为0时,才会打印文本[练习1]。
计算数值condition
有两个简单的规则:
要点3.1 值0
表示逻辑为假。
要点3.2 任何不是0
的值都表示逻辑为真。
运算符==
和!=
允许我们分别测试等式和不等式。如果a
的值等于b
的值,则a == b
为真,否则为假。如果a
等于b
,则a != b
为假,否则为真。知道数值是如何作为条件计算的,我们可以避免冗余。例如,我们可以将

重写为:

这两个版本中哪一个更具可读性是一个编码风格C的问题,可能会引起毫无结果的争论。虽然对于偶尔阅读C代码的人来说,前者可能更容易阅读,但在假定对C的类型系统有一定了解的情况,后者通常是首选。
在stdbool.h
中指定的bool
类型是我们要存储真值时应该使用的类型。它的值有false
有true
。从技术上讲,false
是0
的另一个名称,而true
是1
的另一个名称。重要的是,使用false
和true
(而不是数字)来强调某个值被解释为一个条件。我们将在5.7.4节中了解更多关于bool
类型的信息。
冗余比较很快就变得不可读,并使代码变得混乱。如果你有一个依赖于真值的条件,那么就直接使用这个真值作为条件。同样,我们可以通过重写来避免冗余,将

写为

一般情况下:
要点3.3 不要与0
、false
或true
进行比较。
直接使用真值使你的代码更清晰,这展示了C语言的一个基本概念:
要点3.4 所有标量都有一个真值。
这里,标量C类型包括我们已经遇到的所有数值类型,如size_t
、bool
和int
,以及指针C类型。表3.1中列出了本书中经常使用的类型。我们将在6.2节中讨论它们。
表3.1 本书中使用的标量类型

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