目录
前言:
书接前文,上一篇我们讲到了C语言三种结构中的顺序结构,这回让我们来看看其中的第二种结构——分支结构。
(小提示:阅读本文章需要了解scanf和printf语句以及条件运算符(&&、==、!=等)和逻辑表达式)
何为分支结构?
我们一生会经过很多路口,不管是每天走过车水马龙的十字街头还是在某些人生的节点,我们需要做出自己的判断,然后选择该往哪里走。
在C语言领域也有相对应的分支结构。它首先对运行的程序进行判断,如果符合分支结构的要求,那么你就可以往我这条分支里面走。如果不符合进入这一条分支的条件,那么根据我们前一篇提到的顺序结构,程序会继续往下走,直到找到自己能够进入的分支或是一直走到程序结束也不进入分支。
能实现分支结构语句和运算符。
1. If语句类
①. if语句
②. if
else语句.
③. if
else if
else if
······
else语句
2. Switch语句
3. 三目运算符
? :
一、 If类
1.if···语句
我们小时候常造句:如果明天不下雨,我们就去春游。
在C语言中,If语句就是那个 “如果”,它的后面需要跟上一对括号,里面放着判断的条件。
百闻不如一见,让我们写一个从键盘读取数字判断成绩等级的代码(假设满分是100分)。
(代码解释:如果 a>=80 就打印“你的成绩很优秀”。)
我们设置 “优秀” 的条件是成绩大于等于80分。可以看到,当我们输入a的值是80时,满足 if 语句限制的条件,因此可以进入这一条语句内部,将我们输入的文字打印出来。当我们输入的值是50时,不满足大于等于80的条件,因此这时程序不能进入 if 语句,同时根据顺序结构,程序需要继续往下执行,执行到 “return 0;”时程序结束,没有任何信息的打印。
这时候我们会想:如果我们想将60分以上的成绩定为良好该怎么办呢?能再加一个 if 语句进行描述吗?
如果我们在程序中再加一条 if 语句,确实可以完成对于成绩良好的判断,可是当我们再次输入80时结果却出现了问题:由于C语言的顺序结构,当我们输入80时,既满足第一个 if 语句的条件也满足第二个 if 语句的条件,因此将两个语句内的文字都打印了出来。下面给大家介绍另一种分支语句——if···else···,它或许能解决我们目前遇到的问题。
小知识:如果你知道逻辑表达式,你可以将 if(a >= 60)的条件限制为 if(a >= 60 && a < 80)完成我
们需要的将60~80分划为良好的任务,本文在此不再扩展。
2. if··· else···语句
我们在 if 语句的基础上再加上一条 else 语句,那么一条简单的 if 语句将扩展成为 if else 语句。else语句的作用是将 if 语句没有涉及到的所有的情况全都归属于 else。 我们的代码举例如下:
(代码解释:如果 a>=80 就打印“你的成绩很优秀”,否则打印“你的成绩良好”。)
if···else···语句可以满足我们需要的将60~80分划为良好,80分以上则是优秀的任务,但是当我们输入80分以下的任何一个数字时,else语句都会被执行,程序同样也存在着缺陷。我们似乎回到了 if 语句遇到的问题,如果想要解决这一问题就需要再进一步细分成绩等级,这时我们就得借助新的工具 if···else if···else 语句了。
3.if···else if···else 语句
if···else if···else语句和 if···else···语句类似。只不过 if···else···只有两种选择,不执行 if 语句就执行 else语句。而 if···else if···else 可以根据你的需要增加 ···else if··· 语句来扩充选择路径。
如果我们使用if···else if···else语句,既可以完成对80分以上的判断,也可以完成60~80分以及60分以下的判断,并且即使我们输入的80既满足了 a>=80的条件也满足了a>=60的条件,也只执行了第一条 if 语句的内容而跳过了后续的分支条件,这就是if···else if···else语句一大特点,当程序进去过任何一个满足的条件后出来时就直接跳出分支语句,不再考虑其他条件。
同样,我们可以通过增加···else if···及其判断条件来增加选择。
二、Switch
switch 的构造如上。常量1、2等数字并不代表它们真的只能是数字1、2、3按顺序排列,事实上它们可以是任何的常量,例如字符 'a'、'b'、'c'其实也可算作常量。
语句之后的break是为了让程序跳出switch,不再执行之后的代码。如果省略,程序将会在switch内一直往下走直到遇到break或者从default离开。
default,上述所有条件都不满足,程序将从default离开switch。
对于二选一或者三选一的问题,使用if类的语句很容易进行解决。可是有时候我们面对多选的问题虽然也可以用 if···else if···else if···解决,但程序会显得非常的臃肿,例如,让我们来写一个从键盘输入数字并显示星期几的代码:
使用 if ···else if···完成
使用 switch 完成
(switch后面括号内的n就是我们上面提到的整型表达式,1~7的数字就是对应不同的n的输入值进行分支选择的路径,大致的意思就是如果n是1,就打印星期一等等)
两者完成的结果一致,可是 if else 需要多次使用 else if,在处理简单的多分支问题时的效率不及switch。
switch语句也有它的不足之处:
1.它只能处理整型的数据,对于浮点型的3.14等数据无法进行判断处理;
2.对于在一定范围内的数据switch需要一一列举,无法像 if 一样可以通过逻辑表达式进行处理。
例如如果一个数字在80~100我们输出“优秀”,if(number>=80 && number <= 10)即可完成,而switch需要从80到100一个个用case判断。
三、三目运算符 ? :
三目运算符也就是三元运算符,它由两个符号组成,因此可以携带三个运算对象,分别由? 和 : 分隔开。问号前放置判断条件,冒号左侧是条件成立时返回的结果,冒号右侧是条件不成立时返回的结果。
以寻找两数最大值为例。
(代码解释:a>=b成立吗,如果成立,那么就将a的值赋给max,否则将b的值赋给max)
这一条求解最大值max = (a > b) ? a : b 的三目运算符等价于下列的 if···else···语句
以上就是我们这次关于分支结构的文章,因为我也在对C语言的学习和锻炼中,疏忽遗漏之处在所难免,还望广大读者朋友批评指正。