4.5 if-else语句

1.形式与含义

if(表达式)语句1 else语句2

对于编译器来说。关键字else语句2之间的空白符(至少要有一个)是必须的,否则编译器无法识别else这个关键字。对于人类来说下面的写法似乎更有利于阅读,对于编译器来说它与前面的写法是完全等价的。

4.5 if-else语句 - 图1

if-else表达的含义如图4-2所示。

4.5 if-else语句 - 图2

图4-2 if语句的流程图

和if语句最大的不同在于,在表达式的值为0的情况下,if-else语句不是什么也不做而是选择执行else后面的语句,执行结束后if-else语句结束。

与前面接触到的语句相比,if-else语句卓然不群之处在于它很可能有两个分号,尽管在语法上它是一条语句。

让我回想一下前面是怎么说的。是的,前面说C语言的语句是以“;”或“}”为结束标志的,现在我们看到的是,“;”未必就是一定是语句的结束标志(}不一定是语句的结束标志的情况我们已经有幸见识过了)。这就是C语言的特性,它的描述是严格细腻的,但这种描述已经严格细腻到了很容易就把你给绕进去的地步,很有点“辨证逻辑”的味道。所以在理解C语言语法的时候,不要自作聪明地创造C语言的规则。

很多情况下if-else语句有两个分号这一事实,如果不能说成是造成世界混乱的一个原因的话,那么至少这也是造成C代码混乱、晦涩、难读的原因之一。尤为甚者,是在几个if语句、if-else语句相互嵌套的情况下,下面的一些代码片段就是实例。

练习

用if-else语句改写程序代码4-4。

2.难解的嵌套

4.5 if-else语句 - 图3

解析这段代码的关键在于判断else及后面的子语句与前面两个if中的哪一个相匹配。C语言规定,else与前面最近的且没有与其他else搭配的if相匹配。这样前面的代码片段表达的就是下面的意思:

4.5 if-else语句 - 图4

显然输出的结果为3。类似地,不难分析出下面的代码片段:

4.5 if-else语句 - 图5

的输出为23。下面的代码段有些不同:

4.5 if-else语句 - 图6

尽管第二if没有与任何else相匹配,但是由于{}的存在,else与第一个if相配是很明显的。

3.优雅的利益

如果将上面的代码写成:

4.5 if-else语句 - 图7

4.5 if-else语句 - 图8

就会发现,所谓的if与else匹配的问题,在这种优雅的代码书写方式下面根本就不可能成为一个问题。

如果你和我一样赞成编写程序是为了解决问题而不是自寻烦恼的话,那么你一定赞成回避掉这些苦恼的做法。这种做法很简单:

(1)在写if-else语句(以及if语句)的时候,先写出语句的总体框架,并写成如下形式的总体框架。

4.5 if-else语句 - 图9

(2)在填写{}内的语句时保持缩进格式。如果{}里的语句中还有其他if-else语句,参见前条。

本书后面的许多代码将遵循这样的理性和习惯。所以若是你见到代码中多了几个可以不写的“{}”的话,请不要大惊小怪。

练习

写出下面各代码片段的结果(注:下面代码故意把格式写的很没有章法,若是在真正的程序代码中,这样写是很不应该的)。

4.5 if-else语句 - 图10