4.2 控制流程概述
本章后面的代码清单4.45展示了如何以一种简单方式查看一个数的二进制形式。但即便如此简单的程序,不用控制流程语句也写不出来。控制流程语句控制程序的执行路径。本节讨论如何基于条件检查来改变语句的执行顺序。之后将学习如何通过循环构造来反复执行一组语句。
表4.1总结了所有控制流程语句。注意“常规语法结构”这一栏给出的只是常见的语句用法,不是完整的词法结构。表4.1中的embedded-statement是除了加标签的语句或声明之外的任何语句,但通常是代码块。
表4.1 控制流程语句
表4.1的每个C#控制流程语句都出现在井字棋程序中,可直接查看第4章的源代码文件TicTacToe.cs(http://itl.tc/EssentialCSharpSCC)。程序显示井字棋棋盘,提示每个玩家走棋,并在每一次走棋之后更新。
本章剩余部分将详细讨论每一种语句。讨论了if语句后,要先解释代码块、作用域、布尔表达式以及按位操作符的概念,再讨论其他控制流程语句。由于C#和其他语言存在很多相似性,部分读者可能发现该表格非常熟悉。这部分读者可直接跳到4.9节,或直接跳到本章小结。
4.2.1 if语句
if语句是C#最常见的语句之一。它对称为条件(condition)的布尔表达式(返回true或false的表达式)进行求值,条件为true将执行后续语句(consequence-statement)。if语句可以有else子句,其中包含在条件为false时执行的替代语句(alternative-statement)。常规形式如下:
在代码清单4.20中,玩家输入1,程序将显示"Play against computer selected."(人机对战);否则显示"Play against another player."(双人对战)。
代码清单4.20 if/else语句示例
4.2.2 嵌套if
代码有时需要多个if语句。代码清单4.21首先判断玩家是否通过输入小于或等于0的数表示要求退出,若不是就检查用户是否知道井字棋的最大走棋步数。
代码清单4.21 嵌套if语句
输出4.13展示了结果。
输出4.13
假定第14行显示提示时玩家输入9,那么执行路径如下:
1.第16行:检查input是否小于0。因为不是,所以跳到第20行。
2.第20行:检查input是否小于9。因为不是,所以跳到第26行。
3.第26行:检查input是否大于9。因为不是,所以跳到第33行。
4.第33行:显示答案正确。
代码清单4.21使用了嵌套if语句。为分清嵌套,代码行进行了缩进。但如第1章所述,空白不影响执行路径。有没有缩进和换行,代码执行起来都一样。代码清单4.22展示了嵌套if语句的另一种形式,与代码清单4.21等价。
代码清单4.22 if/else的连贯格式
虽然后一种格式更常见,但无论哪种情况,都应选择代码最易读的格式。
上述两个代码清单的if语句都省略了大括号。但正如马上就要讲到的那样,这和设计规范不符。规范提倡除了单行语句之外都使用代码块。