C语言基础---流程控制-->选择结构
我们知道,C语言是面向过程的语言,由函数构成。一般情况下,一个C语言可能有很多函数,可是,当程序运行的时候,在众多的函数中,从哪个开始呢?要是没有一个统一的规范,每个函数都争着要做最先开始执行,那不是乱套了吗?所幸的是,C语言规定,每个可运行的C程序都必须有且只有(“有且只有”的意思是必须有一个,并且只有一个)一个名为main的函数,由这个main函数作为程序的入口。(入口的意思就是,不管main函数身处何处,都以他马首是瞻,最先执行)。
注:1>如果程序没有main函数,那就不具备执行能力,因为入口都没有。
2>如果程序有多高main函数,完了,每个main函数都争着要先执行,那到底先执行哪个呢?(孔融让梨的故事没听过吗?)
当开始执行main函数后,再顺序执行其余代码。例如:
#include <stdio.h>
int main()
{
printf("Hello-CF\n");
printf("Welcome to\n");
printf("HeiMa\n");
return 0;
}
打印结果为:
Hello-CF
Welcome to
HeiMa
可是,你可能会问,面对千变万化的需求,不可能要求程序一条路走到黑。(就好比人生,我们经常感慨,到了人生的三叉路口了,该如何选择。)程序在执行的过程中也会遇到选择。比如:本人之前是学做j2ee开发,客户要想进入系统,必须在系统的登录界面输入正确的用户名密码,
--------------------------------------------------------------------------------------------------------插图(系统登录界面)
系统程序会进行验证(大致流程如下:先判断用户名、密码框是否为空,如果为空,提示“请输入xxx”;如果不为空,则进一步进行判断用户名、密码是否正确;如果不正确,则提示“xxx错误”,并停留在登录页面;如果都输入正确,则进入系统,登录成功。当然还有涉及权限一块,登录成功后,再进行身份的判断,显示相应的内容。)刚刚说的那么多个“如果”,就是程序的流程控制机构之一:选择结构。其次还有循环结构:当进入系统时,比如是学生管理系统,查看班级学生的信息记录显示在表格中。因为每个学生信息记录的属性都是一样的,因此用循环结构,控制循环次数(学生个数),就可以很方便的输出所有学生记录。试想一下,如果逐条显示记录,那估计都要疯了。如果记录有100条,输出100次?如果变了,是1000条,10000条?估计电脑都疯了。利用简单的循环结构,几行搞定。剩下的就是顺序结构了。
小总结一下:C语言提供了3种流程机构,就这3种流程结构足以应付所有情况
1>顺序结构:默认的顺序从上到下执行每条语句。
2>选择结构:根据给出的条件判断执行哪一段代码(典型的白话文表达就是:如果...就...;如果...就...;否则就...)。
3>循环结构:当给定的条件成立,就反复执行某段代码,只到条件不成立为止。
一、顺序机构:上面代码段就是按默认的顺序执行,没啥可说的。
二、选择结构:选择结构有两种实现方式:if语句、switch语句。
1. 选择结构-->if语句
1>最简单的if语句:
if ( 条件 )
{
语句1;
语句2;
....
}
如果条件为真,则会执行if下面{}代码块里的语句;否则,就不执行。ps:if为关键字,不能以if为标识符命名
例如:
int score=120;
if (score>110)
{
printf("恭喜您通过了黑马的入学测试\n");
}
因此输出结果如下:
恭喜您通过了黑马的入学测试
如果将score赋值为90,则不会执行该语句。
ps:if条件后面的{}是可以省略的,省略之后,只有条件后面的第一条语句和if相关,例如:
int score=120;
if (score>110)
printf("恭喜您通过了黑马的入学测试\n");
printf("再接再厉,小伙子\n");
此时输出结果如下:
恭喜您通过了黑马的入学测试
再接再厉,小伙子
将score赋值为90,程序输出结果为:
再接再厉,小伙子
因为条件不成立,if后面的第一条语句 printf("恭喜您通过了黑马的入学测试\n");就不会执行,但是printf("再接再厉,小伙子\n");不受if影响,照样继续执行。但是代码是给人看的,为了方便大家交流,建议使用{},一目了然,看着舒服。
2>if语句里面嵌套if语句:
int score=426;
if(score>425)
{
printf("恭喜您通过了CET-6"\n);
if(score>525)
{
printf("分数非常优异"\n);
}
}
此时输出结果如下:
恭喜您通过了CET-6
如果将score赋值为526,程序输出结果为:
恭喜您通过了CET-6
分数非常优异
3>if和else一起使用(ps:if、else同为关键字,不能以if、else为标识符命名):
if ( 条件 )
{
语句1;
}
else
{
语句2;
}
如果条件为真,则执行语句1,否则执行语句2。总之:语句1与语句2一定有一个会被执行,并且只能执行一个。(语句1、语句2必须2选1执行)。
例:
int score=426;
if(score>425)
{
printf("恭喜您通过了CET-6"\n);
}
else
{
printf("请您明年再来"\n);
}
此时输出结果如下:
恭喜您通过了CET-6
如果将score赋值423,则输出结果如下:
请您明年再来
ps:同样样可以省略{},如果条件成立,就执行if后面的第1条语句;如果条件不成立,就执行else后面的第1条语句(都只有第一条语句与之相关)。为了代码可读性,不建立省略{}。
4>if、else稍微复杂的形式:
if ( 条件1 )
{
语句1;
}
else if ( 条件2 )
{
语句2;
}
else if ( 条件3 )
{
语句3;
}
...
else
{
其他语句;
}
以此类推,可以有无数个esle if,执行形式同上,在众多的{}中,必须执行一个{}里面的代码块语句,而且只会执行其中的一个{}代码块的语句。例:
int score=90;
if(score>=90&&score<=100)
{
printf("你的等级为A\n");
}
else if (score>=80&&score<89)
{
printf("你的等级为B\n");
}
else if (score>=70&&score<79 )
{
printf("你的等级为C\n");
}
else if (score>=60&&score<69 )
{
printf("你的等级为D\n");
}
else
{
printf("抱歉,您没有及格\n");
}
注1:在写if语句时,if条件后面的小括号()后面没有分号;因为一个分号;也是一条语句,叫做空语句。例:
int score=0;
if (score>110);
{
printf("恭喜您通过了黑马的入学测试\n");
}
程序结果如下:
恭喜您通过了黑马的入学测试
什么?0分也行?不科学啊。
所以分号;一定要注意。一个分号;也是一条语句哦。
注2:
int a=0;
if(a=0)
{
printf("打开开关\n");
}
else
{
printf("关闭开关\n");
}
上面代码没有error,但是,没有error才是最大的error。因为这个error是隐藏的,那样才最可怕。因为你可能写的是判断一个int类型变量值是否0,想写 if(a==0),结果手误写作 if(a=0),为0就“打开开关”,否则就关闭开关。很明显,int类型变量a的值为0,理论上要“打开开关”,但是程序实际结果为:关闭开关
因为()里面的语句是将0赋值给a,所以条件为假,执行“关闭开关”。这不坑爹吗?如果这是航天飞机程序的某行代码,打开开关变为关闭开关,坑死一群人啊。所以一定要小心。if(a==0)最好写作if(0==a),如果手误写作if(0=a),直接报错,逼的你仔细检查。
建议:以后写判断条件语句,变量写后面。
2. 选择结构-->switch语句:
switch(整型表达式)
{
case 数值1:
语句1;
break;
case 数值2:
语句2;
break;
... ...
case 数值n:
语句n;
break;
default :
语句n+1;
break;
}
解释:
当整型表达式的值等于“数值1”时,就会执行“语句1”,后面的break表示退出整个switch语句,也就是直接跳到{}后面的代码
当整形表达式的值等于“数值2”时,就会执行“语句2”;后面的以此类推。如果在数值1~数值n中,没有一个值等于整型表达式的值,那么就 会执行default中的语句n+1。
由于所有的case后面都有个break,因此执行完任意一个case中的语句后,都会直接退出switch语句
例:
int a=1;
switch(a)
{
case 1:
printf("这是周一,工作日\n");
break;
case 2:
printf("这是周二,工作日\n");
break;
case 3:
printf("这是周三,工作日\n");
break;
case 4:
printf("这是周四,工作日\n");
break;
case 5
printf("这是周五,工作日\n");
break;
default :
printf("这是周末,休息日\n");
break;
}
规定a的取值范围是[1,7]的整数。
程序运行结果为:
这是周一,工作日
如果程序改为:
int a=1;
switch(a)
{
case 1:
printf("这是周一,工作日\n");
case 2:
printf("这是周二,工作日\n");
case 3:
printf("这是周三,工作日\n");
case 4:
printf("这是周四,工作日\n");
case 5
printf("这是周五,工作日\n");
default :
printf("这是周末,休息日\n");
break;
}
程序运行结果为:
这是周一,工作日
这是周二,工作日
这是周三,工作日
这是周四,工作日
这是周五,工作日
这是周末,休息日
注:
break;语句的意思是退出整个switch语句,即跳出{},执行{}后面的语句。如果没有break;语句,则继续顺序执行case后面的语句,直到switch语句结束或者遇到break;语句,然后继续执行switch后面的语句。
使用场合:
同为选择结构,什么时候用if,什么时候用switch呢?