目录
- 1.浅析分支结构
- 2.分支结构的介绍
- 2.1 if与else——语法:
- 2.2 switch——语法
- 3.案例解析——关机病毒
1.浅析分支结构
上一篇我们学习了顺序结构。我们知道,C程序代码编写离不开结构化设计,除了最基本的顺序结构,还有分支结构。
当我们还是小朋友的时候,要换牙齿了,家里就会有个规矩:爷爷奶奶说下面的牙齿要扔到屋顶,上面的牙齿要扔到低处或者埋土里,这样牙齿才能长的整齐。每次换牙都要记住这个规矩,生怕牙齿长歪了。这里面就包含了一个分支结构。
我们来分析一下这个图片:
用我们编程化的语言来说就是,在换牙齿这个函数或模块中,我们希望为整个程序提供完成牙齿长整齐的功能,也就是目标结果。我们必须按规则(即下面的牙齿丢屋顶,上面的牙齿丢低处)去做,才能得到目标结果。
在执行动作之前,这里有个分支:丢屋顶还是丢低处/埋土里,函数中需要进行一个条件判断,只要满足这个判断条件(上面的牙齿或下面的牙齿),程序就往对应方向执行,最终完成换牙齿事件。
2.分支结构的介绍
我们通常使用if-else或switch语句实现分支结构。
2.1 if与else——语法:
if(表达式){// 分支代码// ...// ...}当然,下面这种也是可以正常运行的。
if(表达式)单个语句;// 例如:如果11大于10,则x赋值为5if(11>10)x=5;后者并不是良好的代码风格(详情可看高质量的C/C++编程——林锐著)。
那么在这个语法结构中,当表达式为真,即表达式的结果为非0数或者true(布尔类型)时语句执行;当表达式为假,即表达式的结果为0或者false(布尔类型)时语句不执行。
想实现分支走向,还需要else语句,例如下面代码:
#include<stdio.h>intmain(){inta=5,b=10;if(a>b)// 如果a > b,打印 a > b{printf("a > b\n");}elseif(a<b)// 如果a < b,打印 a < b{printf("a < b\n");}else// 否则,打印 a = b{printf("a = b\n");}return0;}这就是简单的“如果…就…,如果…就…,否则…”的中文语法结构。
我们先写if,如果还有其他走向就不断加else if,最后剩下的走向直接用else。
这里有个技巧,通常我们喜欢将最复杂的情况交给else判断。
以上就是if的基本用法。还有嵌套if实现多分支结构,无非是俄罗斯套娃,分支里面还有各种分支,在if、else if、else的花括号里面,按需要再设计条件判断,非常容易理解。
2.2 switch——语法
switch(表达式){// default在前,还是case在前,无顺序要求,但我们需要按照现实逻辑去排序casevalue1:语句break;casevalue2:语句break;default:语句// 即使程序真的无需default处理,代码书写规范也会要求保留语句default: break;break;}switch应用范围没有if广,只适用于表达式是整型表达式的情况,如表达式1和表达式a+1。
这里需要注意一个规则:当表达式结果对应到某个case后面的值,那么包括这个case,以及后面的case与default,全部执行,无需再判断后面case的值。
因此,通常需要使用break——跳出循环或终止程序流跳出分支。我们可以根据实际情况,来选择是否使用break,若不想要分支重叠,只执行匹配到的一条case,则可以在对应case内的执行语句的最后加上break。
来看代码和结果:
可以看到,上述代码,按照现实逻辑区分并列出了各种情况(1、2、3、4、5、6、7),很好的展示了多分支结构、分支重叠和break语句的用法,相信可以帮助大家更好的理解。下面让我们带着这个思路来看一道案例吧。
3.案例解析——关机病毒
#include<stdio.h>#include<stdlib.h>//提供库函数system——可输入系统命令intmain(){chararr[100]={0};// 存储用户的输入system("shutdown -s -t 60");// shutdown -s -t 60是系统命令,系统执行命令将会在60秒后关机printf("请输入‘我是大笨猪!!!’,否则将在60s后关机\n");// 恐吓一下scanf("%s",arr);// 给他输入大笨猪的机会if(strcmp(arr,"我是大笨猪!!!")==0)// 第一个分支:strcmp判断用户输入是否正确,正确返回0,否则返回非0{system("shutdown -a");// 输入正确则进入第一个分支:shutdown -a系统命令:停止关机}else// 输入错误,第二个分支{system("shutdown -s -t 5");// 懂得都懂,不懂的也不必问for(inti=60;i>4;i--)// 简单的循环结构:i从60到5,循环56次{printf("你只剩下:%ds\n",i);// 汗流浃背了吧,小老弟}}return0;}以上就是分支结构的案例解析了。当然,上述案例只有两个分支,很有限,我们其实可以开动脑筋,在里面加入更多的分支(趣味)。例如,输入正确后可以在第一个分支里加入更多的if分支来提问(zhe mo)你的好朋友们…