C#系列五《多样化的程序分支》
上一篇介绍了C#程序设计分支的基本概念与基本操作,这篇的主题是高级的程序分支,例如:分支的嵌套与分支是使用的场景!与三元运算符(?:),废话少说还是开始吧!
1.三元运算符【?:】
三元运算符分为三个部分:1 条件表达式 2 条件表达式成立时返回的值 3条件表达式不成立时返回的值。例如表达式为: a > 0 ? "A>0" : "A<0",这句代码看起来十分混乱那么,我们把它的每个部分都划分的更清晰一些,1[a > 0] ? 2["A>0"] : 3["A<0"], 这时我将这三个部分分别表示出来就清晰很多!了解他的组成我们来看例子(用户输入一个数字,如果数字大于零就在屏幕打印该数字大于零否则屏幕输出该数字小于零):
2 int a = Convert.ToInt32(Console.ReadLine());
3
4 //利用三元运算符?: 根据条件获得对应结果
5 string str = a > 0 ? "该数字大于零" : "该数字小于零";
6
7 Console.WriteLine(str);
好的按惯例我们来分析一下:
我们来看第五行代码: string str = a > 0 ? "该数字大于零" : "该数字小于零"; !
首先判断用户输入的a是否大于0 ,如果大于零那么将问号(?)后面的内容给变量str,如果小于零将冒号(:)后面的值返回给变量str!
最后程序打印结果如下:
这个时候还不算完,可能大家会联想到实现该功能另几种实现方式如:
2 {
3 str = "该数字大于零";
4 }
5 else
6 {
7 str = "该数字小于零";
8 }
9
10
11 switch (a > 0)
12 {
13 case true:
14 str = "该数字大于零";
15 break;
16 case false:
17 str = "该数字小于零";
18 break;
19 }
这样种方式同样也实现了次功能,但是我们还能看出三元运算符在此种情境下是否大大的简化了我们的代码量?所以在程序的开发中我们可以灵活的运用三元运算符来简化我们此种类型(判断一个表达式返回对应结果)的分支场景!
2.如何选择最为合适的分支语句
好的,加上我们在上一篇介绍的两种分支结构与我们刚才介绍的三元运算符我们来看看它们之间的区别以及在实际开发中如何选择最合理的分支结构!
那么我们还是用三种情景的例子来阐述吧!
第一种:当用户输入一个数字判断是否大于零,如果大于零那么输出该数字大于零,如果小于零输出该数字小于零,也就是我们上一个例子,那么根据上边分析后我们根据三种实现方法得出选择三元运算符(?:)是最合理的解决方案,因为它大大的减少了我们满足一个功能的代码量!
第二种:用户输入一个数字代表出生年份得出他的年龄!代码如下:
2 int year = Convert.ToInt32(Console.ReadLine());
3 int sysYear = DateTime.Now.Year;
4
5 if (year > sysYear) //判断出生年份是否大于系统年份 如果大于表示还未出生
6 {
7 Console.WriteLine("该年龄不合法!");
8 }
9 else if (sysYear == year) //判断系统年份是否等于出生年份如果等于 表示刚出生0岁
10 {
11 Console.WriteLine("刚出生0岁");
12 }
13 else//否则就拿系统当前年份减去出生年份输出年龄
14 {
15 Console.WriteLine("年龄为:" + (sysYear - year).ToString());
16 }
从上边例子中我们可以看出,当系统出现一种多种可能的情况下,我们考虑用if语句是最合理的,也是最方便的!
也就是说:在系统出现多种可能如: 判断生日是否合法,判断是否是0岁等等多种可能发生的情况时考虑用IF!
第三种:那么什么时候用switch呢?当一个条件或一个变量拥有多种状态与选择时考虑有switch。看如下场景:用户输入两个数字,在输入一个运算符,运算符只能是加减乘除(+ - * /)这四种,并且计算对应的结果代码如下:
2 int a = Convert.ToInt32(Console.ReadLine());
3 Console.Write("请输入第二个数:");
4 int b = Convert.ToInt32(Console.ReadLine());
5
6 Console.Write("请输入运算符,只能为加减乘除[+ - * /]:");
7 string oper = Console.ReadLine();
8
9 //此时效验 用户输入的是否是 加减乘除
10 switch (oper) // 此时oper拥有多种状态,它可以使 + - * / 也可以是其他字符串
11 {
12 case "+":
13 Console.WriteLine("a + b =" + (a + b).ToString());
14 break;
15 case "-":
16 Console.WriteLine("a - b =" + (a - b).ToString());
17 break;
18 case "*":
19 Console.WriteLine("a * b =" + (a * b).ToString());
20 break;
21 case "/":
22 //这里需要注意 被除数不能为0 所以要加一个判断
23 //根据第二种情景中介绍的当出现一种或多种情况的时候用IF
24 //那么 我们就用If来判断避免这种情况
25 if (b != 0)
26 {
27 Console.WriteLine("a / b =" + (a / b).ToString());
28 }
29 else
30 {
31 Console.WriteLine("被除数不能为零!");
32 }
33 break;
34 default:
35 Console.WriteLine("输入运算符不合法!只能是[+ - * /]");
36 break;
37 }
好的,来分析一下,系统只支持4中运算符,此时运算符在例子中存在变量oper中,那么oper此时就有很多种状态,但是系统只支持它四种状态就是当它为[+ - * /]这四个状态,那么我就可以考虑用switch,这是在执行到21行case "/":
状态为删除时,这是出现了一种情况,就是被除数不能为0,这个时候我们根据上边讲的在这种情况下我们可以考虑使用IF来判断被除数是否等于0,来保证程序的稳定运行!
结果如下:
3.分支的嵌套
了解完分支结构的使用场景后我们来看下,分支结构的嵌套使用,其实在上边的例子中已经使用到了分支结构的嵌套switch嵌套if!那么了解以上概念我想对于分支的嵌套应该已经不算难了,我们就大概的过一下吧!
那么继续一个场景:当用户输入一个数字,打印输出该用户输入数字的提示!
例如: 1.用户输入 0 提示[该数字等于零]
2.用户输入 1 提示[该数字大于零]
3.用户输入 -1提示[改数字小于零]
代码:
2 int a = Convert.ToInt32(Console.ReadLine());
3
4 //首先判断a是否大于零
5 if (a > 0)
6 {
7 Console.WriteLine("a大于零");
8 }
9 else
10 {
11 //在判断a是否等于零
12 if (a == 0)
13 {
14 Console.WriteLine("a等于零");
15 }
16 else//否则就小于零
17 {
18 Console.WriteLine("a小于零");
19 }
20 }
很简单吧?那直接看结果好了:
4.小知识
好接下来看一段代码来阐述一个开发中程序员容易误解的地方!代码如下:
2
3 string resultStr = !string.IsNullOrEmpty(str) && str.Length > 5 ? "大于五" : "小于五";
好问题是:运行的结果是什么?
一般来说我只会得到两个答案: 一是:小于五 二是:抛出异常!
那么为什么会抛出异常呢?
大家都知道当对象为空的时候是没有任何属性和方法的,所以有的人就说了 str 为 Null,所以没有length属性,所以会抛出异常!那就大错特错啦!
为什么?我来告诉你!
首先来看我们 的表达式 !string.IsNullOrEmpty(str) && str.Length > 5 意思为当str不等于空并且str的字符长度大于5时!注意我们用的是并且,并且的意思就是 两边都为真是才为真,也就是说当true && true == true,所以我们知道C#执行顺序是由上到下从左到右执行,所以在执行到!string.IsNullOrEmpty(str)时,表达式已经返回为假[false]了,所以后面的不管是真[true]还是假[true]表达式都不会成立,所以程序在这种情况下会忽略&&后面的表达式,所以结果为第一种答案"小于五"!
OK 结束! 下一篇介绍循环!