![C# 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/707/27111707/b_27111707.jpg)
5.2 分支选择语句
分支选择语句可以根据条件是否满足或者根据表达式的值,来控制代码的执行流程。C#有两种控制代码分支的结构,分别是if语句和switch语句。
5.2.1 if条件语句
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P96_13538.jpg?sign=1739317170-ZFJHMyZYHLcf15WSwxES2YOCTi2jiZJh-0-aea600c7385e57e22424f60b256488fc)
一个if语句的条件可以是布尔变量,也可以是表达式,但如果是表达式,则得到的结果必须是布尔值。
1. 单选择if语句
if语句的语法格式如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T96_66792.jpg?sign=1739317170-HeWUftQMB7DZ37vTnqJHiymqrLyYsZLE-0-496cfab6b2da883c1f40b61a41cd0faa)
如果布尔表达式为true,则if语句内的代码块将被执行。如果布尔表达式为false,则if语句结束后的第一组代码将被执行。
【例5-2】编写程序,使用if语句,判断一个变量是否符合条件。
(1)在Visual Studio 2017中,新建名称为“Project2”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T96_66795.jpg?sign=1739317170-AIq0qbKJE6p2pKgjVWhD2ahP0TOEvZyQ-0-99030d8e9f5bb6bb0776349e5be42feb)
【程序分析】本例演示if语句的用法。在代码中,首先定义一个int类型的变量a,并赋值为10;然后使用if语句对变量a进行判断,如果变量a大于20条件成立,就输出字符串“a大于20”;如果不成立就不输出该字符串,只输出a的值。本例的流程如图5-2所示。
在Visual Studio 2017中的运行结果如图5-3所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P97_13638.jpg?sign=1739317170-JbC10FnJXi4JGe42hc2BU4wOIKMPoKpD-0-44674a8fc6669537d838ec05f46c7b15)
图5-2 if语句的流程图
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P97_13641.jpg?sign=1739317170-GdXA5eDxPxX9Gtq4eRnfdzpZqhVdfUXN-0-897089b12e8a616385e3cae18bac7c8d)
图5-3 if语句
2. if…else语句
一个if语句后可以跟一个else语句。当布尔表达式为假,才会执行else后面的语句。
if…else的语法格式如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T97_66799.jpg?sign=1739317170-9w6qz3J2vKB91OJacHtmJ95S8wtl7Nu7-0-ecb8baa265b9133337d017c79dc9b430)
如果布尔表达式为true,则执行if块内的代码;如果布尔表达式为false,则执行else块内的代码。在前面的章节中讲解了条件运算符(?:),可以用来替代if…else语句。
它的一般形式如下:
<表达式> ? <resultIfTrue> : <resultIfFalse>
其中,计算表达式可得到一个布尔值,运算符的结果根据这个值来确定是<resultIfTrue>,还是<resultIfFalse>。
例如:
int a = 8; string b = (a < 10) "小于10" : "大于10";
该段代码表示,如果变量a小于10条件成立,就将字符串“小于10”赋予变量b,否则就将字符串“大于10”赋予变量b。这里需要注意冒号的使用和位置。
【例5-3】编写程序,使用if…else语句,判断一个变量的大小。
(1)在Visual Studio 2017中,新建名称为“Project3”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T98_66802.jpg?sign=1739317170-2WcK7vwH2trOt3HmKBwtN6Q26udHyXRX-0-b708aca0c4be3f2b2db981f8b17c3e6d)
【程序分析】本例演示if…else语句的使用。在代码中首先定义一个int类型的变量a,并赋值为50;然后对a进行判断,如果a<10,条件成立就输出字符串“a小于10”,否则就输出字符串“a大于10”;最后输出a的值。本例的流程如图5-4所示。
在Visual Studio 2017中的运行结果如图5-5所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P98_13863.jpg?sign=1739317170-ETbqgKID0JZWF9h9uriKI7GCVkKYGbl0-0-593a0dabaa4acd0c879bdabe9bcbcf4a)
图5-4 if…else流程图
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P98_13866.jpg?sign=1739317170-wouZea52IXkcAzw8CQzHw8qtJvlucKlg-0-f9a60fc847bf927eefb71e806ef89c1d)
图5-5 if…else语句
3. if…else if…else 语句
一个if语句后可跟一个可选的else if…else语句。该语句用于执行多种条件。
语法格式如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T98_66803.jpg?sign=1739317170-bJUhZt5swx9QhFzy5MC2BuVzZFD76rxs-0-49469010681f07e4547572c6abc69e5b)
在使用if…else if…else语句时,需要注意以下几点。
(1)一个if后可跟零个或一个else,它必须在任何一个else if之后。
(2)一个if后可跟零个或多个else if,它们必须在else之前。
(3)if语句是自上而下执行,只要有一个条件成立就不会去判断其他任何条件。
其中,else if语句的个数不受限制,但是如果else if语句的个数较多,则应该考虑另一种分支结构:switch语句。
【例5-4】编写程序,输入一位同学的成绩,并输出相应的评价。
(1)在Visual Studio 2017中,新建名称为“Project4”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T99_66806.jpg?sign=1739317170-WlC01i9XmEa0cjdJMXJSEXtLpvYeClzt-0-07d6845fb9242aae56a9bb03b4846470)
【程序分析】本例演示了if…else if…else语句的使用。在代码中首先定义一个string类型的变量s;然后输入一个学生的成绩赋给该变量,并通过Parse()方法,将变量s转换成int类型的数据赋给变量a;最后对a进行判断,输出对应的评价语句。本例的流程如图5-6所示。
在Visual Studio 2017中的运行结果如图5-7所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P100_14219.jpg?sign=1739317170-Ctq8yqQQnH495K08w8iO4qrSBuBmzbTg-0-26391d141e1da57aa975f3341d91c83f)
图5-6 代码流程图
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P100_14228.jpg?sign=1739317170-n2IrD3mAZlkKIUNomCmhXPXaak9uYEXh-0-edb3e4b0da7380e70fe4dc56117b0e02)
图5-7 if…else if…else语句
4. 嵌套if语句
在C#中,嵌套if…else语句是合法的,这意味着用户可以在一个if或else if语句内使用另一个if或else if语句。
C#中嵌套if语句的语法格式如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T100_66809.jpg?sign=1739317170-3AJHtVFORMGDJ3KtrnyZrHK5F3mmJyfV-0-0966a129fcdd0c4891fddfd0fc717c82)
也可以嵌套else if…else语句,该方式与嵌套if语句相似。
【例5-5】编写程序,使用嵌套的if语句,计算出打折后的机票价格。
(1)在Visual Studio 2017中,新建名称为“Project5”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T100_66810.jpg?sign=1739317170-Xpf4ERqFvlqzmQxfkSgWDQYpQb7EMO6M-0-8e2c804720af67dba5abb124862381e4)
【程序分析】本例演示了嵌套if语句的使用。在代码中,定义了三个变量money、month、type,分别用于表示机票价格、月份和飞机仓位;然后通过嵌套的if语句,计算出某个月份预订机票的打折价格。本例的流程如图5-8所示。
在Visual Studio 2017中的运行结果如图5-9所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P101_14573.jpg?sign=1739317170-pJzx38Kqmlj7EnZ6axLocGiwXghv2hh2-0-4d353ea6d6038c6cee12a419c148924d)
图5-8 嵌套if语句流程图
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P101_14576.jpg?sign=1739317170-bEeuAFXsfle1hXRlf2e5sa8mPKKTkQuR-0-5e6e615a811737c8faae907d2a08838b)
图5-9 嵌套if语句
5.2.2 switch语句
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P101_14581.jpg?sign=1739317170-KtjyC9GFwYhiQM4tSC2wZRcfE8a2bcai-0-1fb9c6e1afa881fdadf798682f3dc880)
一个switch语句允许测试一个变量等于多个值时的情况。每个值称为一个case,且被测试的变量会对每个case进行检查。
switch语句的语法格式如下:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T102_66814.jpg?sign=1739317170-BiuKW1NsunCc6GH6HOJkTDPQZ8Q97vhO-0-ff55b0959b7e96b20e2be88306385869)
在switch语句的开始,首先计算控制表达式的值,如果该值符合某个case语句中指定的“测试值”,就跳转到该case内的语句执行;当控制表达式的值没有任何匹配的“测试值”时,则执行default内的代码,执行完后退出switch语句,继续执行下面的代码。其中,测试值只能是某个整数类型或字符类型,并且各个测试值不能相同。default是可选的,没有default语句时,如果控制表达式的值不等于任何“测试值”,程序一样会退出switch而执行后面的代码。
【例5-6】编写程序,使用switch语句完成一个简单的计算器程序,用户输入两个数字,用四则运算符计算结果并显示在控制台上。
(1)在Visual Studio 2017中,新建名称为“Project6”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T102_66815.jpg?sign=1739317170-ZPk9gEp8wphJ0DTpDCkmNyofe6qnz6Me-0-4f522661782289b98d9dd73583b1ce31)
【程序分析】本例演示了switch语句的使用。在代码中首先定义三个变量x、y、z。其中,x和y用来接收用户输入的两个数字,变量z用来接收运算类型。利用switch语句,判断用户输入的运算符号,在控制台显示相应的运算成果。其中,default用来显示如果运算符号输入有误的相关信息。本例的流程如图5-10所示。
在Visual Studio 2017中的运行结果如图5-11所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P103_14942.jpg?sign=1739317170-WLnlM3NSPR5E2IWvmSsFVHHbFbPYH5IM-0-03d9b6f76876008578334567e77d14cf)
图5-10 switch流程图
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P103_14951.jpg?sign=1739317170-H5ttQWooF8oXHBUxrf3n60m5b0Sgd1vb-0-1631db4c794ed231d77cca06dee6cf5b)
图5-11 switch语句
用户可以把一个switch语句嵌套在另一个switch语句内。即使内部和外部switch的case常量包含共同的值,也是没有矛盾的。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T103_66818.jpg?sign=1739317170-SO44CJbrldZYgLR7QyGdlHNHghm1LSgC-0-b0bb40c1b78c96ad9f26a6fca13b8b99)
【例5-7】编写程序,使用嵌套的switch语句,输出case后面的内容。
(1)在Visual Studio 2017中,新建名称为“Project7”的文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T104_66820.jpg?sign=1739317170-0LHWIBkee15H3qzFIVvTwuQ4hPwU3k4H-0-7d7f6eb528e76aa0eb69ed29e4a2cf35)
【程序分析】本例演示了嵌套的switch语句。在代码中,首先定义两个char型的变量c1和c2,并分别赋值为'A'和'B';然后通过switch语句对c1进行判断,当遇到符合的case时,就输出字符串“这是外部switch的一部分”;接着又嵌套了一个switch语句,并对c2进行判断,当遇到符合的case时,就输出字符串“这是内部switch的一部分”;最后再输出c1和c2的值。
在Visual Studio 2017中的运行结果如图5-12所示。
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-P104_15261.jpg?sign=1739317170-9NYnazVEqukGLIKJJVJk1sInTiTiUcL5-0-525e5b1b602a8d5500d5b74fedd6e999)
图5-12 switch语句的嵌套
switch语句是非常有用的,但是在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则。
(1)只能针对基本数据类型使用switch,这些类型包括int和string等。对于其他类型,则必须使用if语句。
(2)case标签必须是常量表达式,如37或者“37”。如果需要在运行时计算case标签的值,必须使用if语句。
(3)case标签必须是唯一性的表达式;也就是说,不允许两个case具有相同的值。
(4)可以连续写下一系列case标签(中间不能间插额外的语句),从而指定自己希望在多种情况下都运行相同的语句。如果像这样写,那么最后一个case标签之后的代码将适用于所有case。然而,假如一个标签关联了一条或多条语句,又没有使用break语句跳出,那么执行就不能贯穿到后续的标签,而且编译器会报告一个错误。
例如:
![](https://epubservercos.yuewen.com/938BD7/15477656705638906/epubprivate/OEBPS/Images/Figure-T104_66824.jpg?sign=1739317170-lNprw6S0HhldwV19YIUcMBKYdWmnyEUq-0-e0478cf4e7e84c62920197af01322110)
注意:由于C#存在不准贯穿的规则,所以需要一条跳转语句来阻止贯穿,而break语句则是最常见的方式,但是也可以用一条return语句或者一条throw语句来替代它。