4.5 if-else语句
1.形式与含义
if(表达式)语句1 else语句2
对于编译器来说。关键字else与语句2之间的空白符(至少要有一个)是必须的,否则编译器无法识别else这个关键字。对于人类来说下面的写法似乎更有利于阅读,对于编译器来说它与前面的写法是完全等价的。
if-else表达的含义如图4-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.难解的嵌套
解析这段代码的关键在于判断else及后面的子语句与前面两个if中的哪一个相匹配。C语言规定,else与前面最近的且没有与其他else搭配的if相匹配。这样前面的代码片段表达的就是下面的意思:
显然输出的结果为3。类似地,不难分析出下面的代码片段:
的输出为23。下面的代码段有些不同:
尽管第二if没有与任何else相匹配,但是由于{}的存在,else与第一个if相配是很明显的。
3.优雅的利益
如果将上面的代码写成:
就会发现,所谓的if与else匹配的问题,在这种优雅的代码书写方式下面根本就不可能成为一个问题。
如果你和我一样赞成编写程序是为了解决问题而不是自寻烦恼的话,那么你一定赞成回避掉这些苦恼的做法。这种做法很简单:
(1)在写if-else语句(以及if语句)的时候,先写出语句的总体框架,并写成如下形式的总体框架。
(2)在填写{}内的语句时保持缩进格式。如果{}里的语句中还有其他if-else语句,参见前条。
本书后面的许多代码将遵循这样的理性和习惯。所以若是你见到代码中多了几个可以不写的“{}”的话,请不要大惊小怪。
练习
写出下面各代码片段的结果(注:下面代码故意把格式写的很没有章法,若是在真正的程序代码中,这样写是很不应该的)。