7.C程序的流程控制
7.1.明确:C程序是一个结构化程序,就是以顺序,分支,循环三种基本结构构建的
单入口单出口的程序
类比:C程序----->一栋楼
顺序------->一居室
分支-------->二居室
循环-------->三居室
顺序结构:就是CPU从上到下依次运行
7.2.分支结构
a)分支结构功能:实现多选一
分支结构分两类:条件分支和开关分支
b)条件分支
语法格式:
形式1:
if(表达式1) {
语句1;
}
语义:如果表达式1为真,那么就执行语句1
例如:
int a = 1;
if(a == 1) { //中规中矩的程序员
printf("a等于1\n");
}
//好程序员
if(1 == a) {
printf("a等于1\n");
}
为了防止将"=="写成"="
if(a =1) //成立,变成赋值
if(1 = a) //gcc报错,帮你纠错
形式2:
if(表达式1) {
语句1;
}
else {
语句2;
}
语义:如果表达式1为真,那么运行语句1,否则运行语句2
例如:
int a = 1;
if(1 == a) {
printf("a等于1\n");
}
else {
printf("a不等于1\n");
}
形式3:
if(表达式1) {
语句1;
}
else if(表达式2) {
语句2;
}
...
else if(表达式N) {
语句N;
}
语义:如果表达式1为真,那么执行语句1,如果表达式1不为真,那么执行表达式2,如果表达式2
为真,那么执行语句2,如果表达式2不为真,依次向下判断
例如:
int a = 1;
if(1 == a) {
printf("a等于1\n");
}
else if(2 == a) {
printf("a等于2\n");
}
else if(3 == a) {
printf("a等于3\n");
}
形式4:
if(表达式1) {
语句1;
}
else if(表达式2) {
语句2;
}
...
else if(表达式N) {
语句N;
}
else {
语句M;
}
语义:如果表达式1为真,那么执行语句1,如果表达式1不为真,那么执行表达式2,如果表达式2
为真,那么执行语句2,如果表达式2不为真,依次向下判断,如果上面都不成立,最后
运行语句M
例如:
int a = 1;
if(1 == a) {
printf("a等于1\n");
}
else if(2 == a) {
printf("a等于2\n");
}
else if(3 == a) {
printf("a等于3\n");
}
else {
printf("不知道是什么数,a = %d\n", a);
}
c)条件分支使用注意事项
1.if和else的配对原则:else或者else if和最近的if配对
2.如果语句只有一条,{}是可以省略的(由衷建议加上)
if(1 == a) {
printf("a等于1.\n");
}
等价于
if (1 == a)
printf("a等于1.\n");
3.{}是否独占一样问题:根据公司的编码规范来定
原则:只要是linux系统软件开发,{}不会独占一行
//linux程序员
if(1 == a) {
printf("a等于1.\n");
}
//公司编码规范
if(1 == a)
{
printf("a等于1.\n");
}
案例:利用if..else来判断三个数中的最小数
c)开关分支结构特点
1.开关分支语法
switch(控制表达式) {
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
...
case 常量表达式N:
语句N;
break;
default:
语句M;
break;
}
执行过程:控制表达式的值和下面case对应的常量表达式的值一样(相等)
那么就会执行对应的语句,一旦遇到break,switch...case开关分支立刻结束
如果case都不相等,最后只能执行default对应的语句
2.开关分支结构使用注意事项
a)控制表达式被当成一个整数处理(int),可以是字符,但是不能是浮点数和字符串(例如:"abc")
例如:
switch(5) //可以
switch(5.5) //不可以
switch("abc") //不可以
switch('a') //可以
b)常量表达式必须是常量,例如:5,'A',2+5等,不允许有重复的分支case
int cmd = 250;
switch(cmd) {
case 250:
break;
case 250: //gcc编译器报错,迷茫了
break;
}
c)如果其中某个case对应的break没有添加,当这个case成立时,并且运行其语句之后
会继续执行下一个case
所以建议如果代码需要break,写完case单子之后,先写一个break出来,防止忘掉!
int cmd = 250;
switch(cmd) {
case 250:
printf("1.\n");
case 251:
printf("2\n");
break;
...
default:
break;
}
结果:打印1和2
d)default关键字可以写在任意case的前面,但是需要添加break
如果default关键字写在最后,break是可以省略的
帅的人都是将default写在后面
e)分支case或者default中如果定义变量,记得加{}
将来这个变量只能给对应的case使用!
例如:
int cmd = 250;
switch(cmd) {
case 250:
printf("1.\n");
case 251: {
char c = '2'; //定义字符变量
printf("%c\n", c);
break;
}
...
default:
break;
}
案例:输入一个0~100的整数来表示学生的考试成绩,打印等级:
考分 等级
90~100 A
80~89 B
70-79 C
60-69 D
其他都是E
要求用switch..case实现
总结:if...else和switch..case对比:
1.switch...case能做的,if...else都能做
2.if...else能做的,switch...case不一定能做,比如处理浮点数或者字符串
3.switch...case某些场合极其繁琐
例如:判断0~1000的范围,如果用switch...case,必须添加1000条case
但是如果用if语句,一条拿下:if(xxx > 0 && xxx < 1000)
4.gcc编译器对switch...case生成的代码量要比if...else要少,所以switch代码执行效率高