
3.2 选择语句
选择语句并不是顺序执行的,前面已经提到。如同人们生活中的不同选择,程序中也存在着选择。
如登录系统时的验证,当用户名、密码正确时便可进入系统,但只要密码有误,就不能进入系统。这是一种选择,在不同的状态下系统接下来执行不同的操作。
C#提供了多种选择语句类型,以满足不同的程序需求,如下所示。
□ if语句 当满足条件时执行。
□ if else语句 当满足条件时执行if后的语句,否则执行else后的语句。
□ if else if else if语句 当满足条件时执行if后的语句,否则满足第2个条件执行else if后的语句,否则满足第3个条件执行else if后的语句。
□ switch case语句 不同条件下执行不同语句。
3.2.1 if语句
if语句是选择语句中最简单的一种,表示当指定条件满足时,执行if后的语句。执行流程如图3-1所示。

图3-1 if语句流程图
if语句执行时,首先判断条件表达式是否为真:条件为真执行if语句下的语句块,结束条件语句;条件为假直接结束条件语句块,执行if语句块后面的语句。语法如下:
if(条件表达式) {条件成立时执行的语句}
当条件表达式成立时,执行{}内的语句,否则不执行。if括号内和括号后不用使用分号;{}符号内的语句是基本语句,必须以分号结尾;{}符号后不需要使用分号,其用法如练习3-1所示。
【练习3-1】
程序中定义变量rpas表示用户输入的密码,密码的正确数据为“123456”,若密码正确则输出“登录成功!”字样,使用语句如下:
static void Main(string[] args) { Console.WriteLine("请输入密码:"); string rpas = Console.ReadLine(); if(rpas=="123456") { Console.WriteLine("登录成功!"); } Console.WriteLine("登录结束"); }
运行上述代码,输入正确的密码“123456”和错误的密码“123123”,当密码正确,输出“登录成功!”字样,如图3-2所示;而当密码有误,如图3-3所示,程序跳过了if语句块的执行,直接执行后面的语句,输出“登录结束”字样。

图3-2 密码验证成功

图3-3 密码无效
3.2.2 if else语句
if else语句在if语句的基础上,添加了当条件不满足时进行的操作。执行流程如图3-4所示。

图3-4 if else语句流程图
条件的成立只有两种可能,即成立和不成立。if else语句在条件表达式成立时与if语句一样执行if后的语句块1,并结束条件语句;条件表达式不成立时执行else后的语句块2,执行完成后结束条件语句。语法如下:
if(条件表达式) {条件表达式成立时执行的语句} else {条件表达式不成立时执行的语句}
else后的{}内同样是基本语句,以分号结尾,{}符号后不需要使用分号,如练习3-2所示。
【练习3-2】
同样以密码的验证为例,在练习3-1的基础上添加密码验证失败的提示,即密码有误时,输出“密码有误!”字样,代码如下:
static void Main(string[] args) { Console.WriteLine("请输入密码:"); string rpas = Console.ReadLine(); if (rpas == "123456") { Console.WriteLine("登录成功!"); } else { Console.WriteLine("密码有误!"); } Console.WriteLine("登录结束"); }
同样是密码的登录,这次添加密码无效时需要执行的语句,则输入错误的密码时,其效果如图3-5所示。程序跳过了if语句块的执行,而执行else语句块中的语句,输出“密码有误!”字样。

图3-5 密码有误
3.2.3 if else if语句
if else if语句相对复杂,它提供了多个条件来筛选数据,将数据依次分类排除。程序流程如图3-6所示。

图3-6 if else if语句流程图
如图3-6所示,if else if语句在程序进入语句时,首先判定第一个if下的条件1。
□ 条件1成立,执行语句块1并结束条件语句。
□ 条件1不成立,判断条件2,条件2成立,执行语句块2并结束条件语句。
□ 条件2不成立,判断条件3,条件3成立,执行语句块3并结束条件语句。
□ 条件3不成立,执行语句块4并结束条件语句。
图中只有3个条件和一个else语句。在if else if语句中,条件可以是任意多个,但else语句小于等于1个。即else语句可以不要,也可以要,要的话只能有1个,因为条件只有成立和不成立两种结果。
if else if语句基本语法如下:
if (条件表达式1) {语句块1} else if (条件表达式2) {语句块2} else if (条件表达式3) {语句块3} … [else] {}
表达式和语句块的语法同if语句和if else语句一样,有如下的实例。
【练习3-3】
程序中定义变量age表示年龄,定义变量title表示称呼,我国有着根据不同年龄对一个人的称呼,如童年、少年、青年、中年、老年,根据年龄判断称呼,语句如下。
Console.WriteLine("请输入年龄:"); int age =Convert.ToInt32(Console.ReadLine()) ; string title=""; if (age < 6) { title = "童年"; } else if (age < 17) { title = "少年"; } else if (age < 40) { title = "青年"; } else if (age < 65) { title = "中年"; } else { title = "老年"; } Console.WriteLine("{0}岁的人们称为:{1}",age,title);
运行上述代码,分别使用年龄15、23和45来测试程序的运行结果,其效果分别如图3-7、图3-8和图3-9所示,输出了对应的称谓。

图3-7 15岁时的称呼

图3-8 23岁时的称呼

图3-9 45岁时的称呼
示例中第二个条件为age<17,虽然年龄小于17的还有童年,但童年在第一个条件中已经排除。因此这里使用age<17与使用age>=6 && age<17效果是一样的。
提示
还有一些不需要使用最后的else语句的例子,此时,if和else if将所有的可能性都包括了。
3.2.4 switch语句
switch语句的完整形式为switch case default。switch语句与if else if语句用法相似,但switch语句中使用的条件只能是确定的值,即条件表达式等于某个常量,不能使用范围。switch case语句流程图如图3-10所示。

图3-10 switch语句流程图
如图3-10所示,switch语句在程序进入语句时,首先判定常量1是否与条件相等。常量可以是具体数值,也可以是表达式。
□ 条件与常量1相等,执行语句块1并结束条件语句。
□ 条件与常量2相等,执行语句块2并结束条件语句。
□ 条件与常量3相等,执行语句块3并结束条件语句。
□ 条件与三个常量都不相等,执行语句块4并结束条件语句。
图中只有3个条件表达式和一个default语句。default语句表示剩余的情况,与else类似。
与if else if语句一样,条件常量可以是任意多个,default语句可以不要,也可以要,要的话只能有1个,因为条件只有成立和不成立两种结果。
switch语句基本语法如下:
switch (条件表达式) { case 常量1: 语句块1 break; case 常量2: 语句块2 break; case 常量3: 语句块3 break; … [default] }
switch语句只使用一个{}包含整个模块;break语句属于跳转语句,用于跳出当前选择语句块。
switch语句与if语句不同,当条件符合并执行完当前case语句后,不会默认跳出条件判断,将会接着执行下一条case语句,使用break语句后,程序将跳出switch语句块,执行后面的语句。
如当表达式等于常量1,执行了第一个case语句。若不使用break,将执行第二个case语句而无论表达式是否等于常量2;若使用了break,接下来将执行switch{}后的语句。对switch语句的使用,如练习3-4所示。
【练习3-4】
接收一个从1到7的任意数字,输出对应的一周7天,其中,数字1对应星期一,使用语句如下:
Console.WriteLine("请输入日期:"); int age = Convert.ToInt32(Console.ReadLine()); string title = ""; switch (age) { case 1: title = "星期一"; break; case 2: title = "星期二"; break; case 3: //部分代码省略 break; case 7: title = "星期天"; break; } Console.WriteLine("您选择了:{0}",title);
运行上述代码,分别使用数字2和数字7来验证程序的运行结果,如图3-11和图3-12所示。

图3-11 选择2的执行结果

图3-12 选择7的执行结果
注意
case语句的值是唯一的,即任何两个case语句不能具有相同的值。