文章目录
前言
分支语句包括 if、switch
一、if 语句
通用形式
if(条件表达式)
{
//语句;
}
执行过程:如果条件表达式的值为真(非0),则执行语句 1,否则不执行语句 1
例子:
//输入两个值,并判断最大值
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入两个数:");
scanf("%d %d", &a, &b);
max = a; //假设a为最大值
if (b > max)
max = b; //若b的值大于max的值,则将b的值赋给max,否则最大值为a
printf("最大值为:%d", max);
return 0;
}
二、if else 语句
通用形式
if(条件表达式)
{
//语句1;
}
else
{
//语句2;
}
执行过程:如果条件表达式为真(非0),则执行语句 1;如果条件表达式为假或 0,则执行 else 后面的语句 2
例子:
//输入两个值,并判断最大值
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
int max = 0;
printf("请依次输入两个数:");
scanf("%d %d", &a, &b);
if (a < b)
max = b;
else
max = a;
printf("最大值为:%d", max);
//若a小于b,将b的值赋给max后输出最大值,否则将a的值赋给max并输出
return 0;
}
三、多重选择 else if
通用形式
if(条件表达式1)
{
//语句1;
}
else if(条件表达式2)
{
//语句2;
}
else if(条件表达式3)
{
//语句3;
}
//......
else
{
//语句n;
}
执行过程:依次判断条件表达式的值,当某个值为真时,则执行相应的语句,然后跳出整个 if 语句之外,继续执行后面的程序;如果所有的表达式都为假,则执行语句n,然后执行后面的程序
例子:
//输入成绩分数(0~100分),并判断该成绩属于哪个等级
//成绩等级:90~100(A),80~90(B),70~80(C),60~70(D),0~60(不合格)
#include<stdio.h>
int main()
{
int score = 0;
printf("请输入成绩:");
scanf("%d", &score);
if (0 <= score && score <= 100)
{
if (90 <= score) //已经包含了score <= 100
printf("等级:A\n");
else if (80 <= score) //else已经包含了score < 90
printf("等级:B\n");
else if (70 <= score)
printf("等级:C\n");
else if (60 <= score)
printf("等级:D\n");
else
printf("成绩不合格!!\n");
}
else
printf("输入成绩有误!!\n");
return 0;
}
实际上 else if 是 if else 语句的变式
例如,上面例子的程序段是下面代码的另一种写法:
if (0 <= score && score <= 100)
{
if (90 <= score)
printf("等级:A\n");
else
if (80 <= score)
printf("等级:B\n");
else
if (70 <= score)
printf("等级:C\n");
else
if (60 <= score)
printf("等级:D\n");
else
printf("成绩不合格!!\n");
}
else
printf("输入成绩有误!!\n");
若程序中有多个if和else,编译器如何知道哪个if对应哪个else?
考虑如下程序段
if(num>0)
if(num<100)
printf("num在0~100的范围内\n");
else
printf("num不在0~100的范围内\n");
这时,else与第一个 if 还是第二个 if 匹配?答案是第二个,虽然书写的格式看起来是与第一个 if 匹配,但规则是,如果没有{},else 会与离它最近的 if 匹配,除非最近的 if 被大括号 {} 括起来
修改如下:
if(num>0)
{
if(num<100)
printf("num在0~100的范围内\n");
}
else
printf("num不在0~100的范围内\n");
四、switch 语句
1.switch 用于多分支
通用形式
switch(整型表达式)//表达式不允许是浮点型
{
case 常量表达式 1: 语句1(集合);
case 常量表达式 2: 语句2(集合);
//...
case 常量表达式 n: 语句n(集合);
default:语句 n + 1;//default:默认
}
执行过程:首先计算表达式的值,与常量表达式进行比较,如果与其中一个常量表达式 i 的值相等,就执行其后的语句直到遇到 break 语句才结束 switch 语句,如果 case 后无 break 语句,则继续执行随后所有的 case 后的语句。如果没有找到与表达式的值相匹配的常量表达式,则执行 default 后的语句 n + 1
例子:
输入数字1-7,并输出显示对应的星期
源代码:
//输入数字1-7,并输出显示对应的星期
#include <stdio.h>
int main()
{
int day = 0;
do
{
printf("今天星期几:");
scanf("%d", &day);
switch (day)
{
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;
case 6:printf("今天星期六\n"); break;
case 7:printf("今天星期天\n"); break;
case 0:printf("退出!\n"); break;
default:printf("输入数据有误!!\n");
}
printf("\n");
} while (day);
return 0;
}
运行结果:
注意
- switch 后面括号中的表达式可以是整型、字符型、枚举型,不允许是浮点型
- 在 case 后,允许有多个语句,可以不用{}括起来
- 各 case 和 default 语句的先后顺序可以改变,不影响程序执行结果(default 通常放末尾)
2.跳转语句(break、continue、goto)
- break语句:会中止包含它的循环或 switch 语句的剩余部分,并执行跟在循环或 switch 后面的语句
- continue 语句:跳出本次循环,执行下一次循环
- goto 语句:使程序控制跳转至相应标签语句
3.如果 switch 语句中的 case 后没有用 break 来跳出循环
如果 switch 语句中的 case 后没有用 break 来跳出循环,那么在执行对应的一个 case 后的语句后会接着执行紧跟其后的 case 语句,除非遇到 break 跳出 switch 语句或者执行完接下来的 switch 语句部分
4.合理使用 break 语句
上面的例子改为:输入数字 1 - 7,并输出显示对应的星期是工作日还是休息日(定 1~5 为工作日,6、7 为休息日)
源代码:
//输入数字1-7,并输出显示对应的星期是工作日还是休息日(定1~5为工作日,6、7为休息日)
#include <stdio.h>
int main()
{
int day = 0;
printf("今天工作日还是休息日:");
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("今天是工作日\n"); break;//输入1~5结果都是执行同一 printf 语句
case 6:
case 7:printf("今天是休息日\n"); break;//输入6、7结果都是执行同一 printf 语句
default:printf("输入数据有误!!\n");
}
return 0;
}
运行结果:
在修改后的 switch 语句中,输入 1~4,进入 switch 语句后都会执行与之匹配的 case,直到执行完 case5 语句后的 printf 语句与 break 并跳出 switch 语句,也就是说输入 1~5 结果都是执行同一 printf 语句即打印输出“今天是工作日”,6~7 同理