- C# 8.0本质论
- (美)马克·米凯利斯
- 979字
- 2022-03-30 10:15:14
4.2 控制流程概述
本章后面的代码清单4.45展示了如何以一种简单方式查看一个数的二进制形式。但即便如此简单的程序,不用控制流程语句也写不出来。控制流程语句控制程序的执行路径。本节讨论如何基于条件检查来改变语句的执行顺序。之后将学习如何通过循环构造来反复执行一组语句。
表4.1总结了所有控制流程语句。注意“常规语法结构”这一栏给出的只是常见的语句用法,不是完整的词法结构。表4.1中的embedded-statement是除了加标签的语句或声明之外的任何语句,但通常是代码块。
表4.1 控制流程语句
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/4b1.jpg?sign=1738926158-O0e8nZAUQUsy7OsxZEdApsrF50nFyqec-0-903ce97dabcaa7ef488c9168c932a071)
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/4b1x.jpg?sign=1738926158-U0vR2zzcsHuH5AEkeuuaWSyj2fh0rPTL-0-ec0318976a657ee85c6769a4928bd998)
表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)。常规形式如下:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/117-i.jpg?sign=1738926158-MECN28XoRzn1IiVKhqfGTkgQJTUuoKEu-0-e24859fd123000326385eb8c6ef1722b)
在代码清单4.20中,玩家输入1,程序将显示"Play against computer selected."(人机对战);否则显示"Play against another player."(双人对战)。
代码清单4.20 if/else语句示例
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d4.20.jpg?sign=1738926158-RurOZFW0LgILsihJkL0gUNfzkItW8b6a-0-a6ff1ec902b8bd408b61982d00f756a8)
4.2.2 嵌套if
代码有时需要多个if语句。代码清单4.21首先判断玩家是否通过输入小于或等于0的数表示要求退出,若不是就检查用户是否知道井字棋的最大走棋步数。
代码清单4.21 嵌套if语句
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d4.21.jpg?sign=1738926158-QdjOzS70NWZfqC16VmaBiKfWysQtDVXS-0-4fcb54538e9156abf9584fb300f04717)
输出4.13展示了结果。
输出4.13
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/s4.13.jpg?sign=1738926158-Nzy55V66BUrdxP81t0Hv9NeTYs96Q2Q9-0-b71007b8ee934f1735031474cfc4c887)
假定第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的连贯格式
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d4.22.jpg?sign=1738926158-faOxHgePNC87jYM77lQHu9MNnfi7Zg09-0-e5383fa555b6b36e7e669d2a02e5dc7d)
虽然后一种格式更常见,但无论哪种情况,都应选择代码最易读的格式。
上述两个代码清单的if语句都省略了大括号。但正如马上就要讲到的那样,这和设计规范不符。规范提倡除了单行语句之外都使用代码块。