分支结构
一、if-else
1.单分支
语法:
if(条件表达式){
语句块;
}
执行流程:
条件表达式为真(值不为 0 )时,就执行语句块。
2.双分支
语法:
if(条件表达式) {
语句块1;
}else {
语句块2;
}
执行流程:
1.首先判断条件表达式看其结果是为真(值不为 0 )还是假(值为 0)
2.如果是真,就执行语句块 1
3.如果是假,就执行语句块 2
3.多重分支
语法:
if (条件表达式1) {
语句块1;
} else if (条件表达式2) {
语句块2;
}
...
}else if (条件表达式n) {
语句块n;
} else {
语句块n+1;
}
执行流程:
1.首先判断条件表达式 1 看其结果是真(值不为 0 )还是假(值为 0)
2.如果是真,就执行语句块 1,然后结束当前多分支
3.如果是假,就继续判断条件表达式 2,看其结果是真还是假
4.如果是真,就执行语句块 2,然后结束当前多分支
5.如果是假,就继续判断条件表达式 … 看其结果是真还是假
…
n. 如果没有任何关系表达式为真,就执行语句块 n+1,然后结束当前多分支。
4.拓展
当条件表达式之间是“
互斥
”关系时(即彼此没有交集),条件判断语句及执行语句间顺序无所谓。
例如:当 type=1 时输出香蕉,当 type=2 时输出苹果,当 type=3 时输出梨子,则下列两种写法的顺序都是可以的
// 写法 1
if(type == 1)
{
printf("香蕉");
}
else if(type == 2)
{
printf("香蕉");
}
else
{
printf("梨子");
}
// 写法 2
if(type == 3)
{
printf("梨子");
}
else if(type == 2)
{
printf("香蕉");
}
else
{
printf("香蕉");
}
当条件表达式之间是“
包含
”关系时,“小上大下 / 子上父下
”,否则范围小的条件表达式将不可能被执行。
例如:成绩在 [0, 59] 之间为不合格,成绩在 [60, 79] 时为合格,成绩在 [80, 100] 时为优秀
让我们来分析一下第二种的错误写法,因为成绩但凡大于等于 80 的则一定也会大于等于 60,所以只要成绩大于等于 60 则就没有机会进行是否大于等于 80 的判断了,故这是错误的写法。
// 正确写法
if(score >= 80)
{
printf("优秀");
}
else if(score >=60)
{
printf("合格");
}
else
{
printf("不合格");
}
// 错误写法
if(score >= 60)
{
printf("合格");
}
else if(score >=80)
{
printf("优秀");
}
else
{
printf("不合格");
}
当 if-else 结构是“多选一”时,最后的
else是可选的
,根据需要可以省略
// 正确写法
if(score >= 80)
{
printf("优秀");
}
else if(score >=60)
{
printf("合格");
}
else if(score >=0)
{
printf("不合格");
}
语句块只有一条执行语句时,一对
{}可以省略
,但建议保留
// 正确写法
if(score >= 80) printf("优秀");
else if(score >=60) printf("合格");
else printf("不合格");
如果有多个 if 和 else ,没有 {} 的情况下, else 总是跟最接近的 if 匹配。为了提供代码的可读性,建议使用大括号,明确 else 匹配哪一个 if 。
5.判断是否是闰年
编写一个程序,判定某个年份是否为闰年。年份满足如下条件之一,即是闰年:
(1) year 是 400 的整数倍: year%400==0
(2) 能被4整除,但不能被100整除:year % 4 == 0 && year % 100 != 0
#include<stdio.h>
int main() {
int year;
printf("输入年份: ");
scanf("%d", &year);
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
printf("%d 是闰年\n", year);
else
printf("%d 不是闰年\n", year);
return 0;
}
二、switch-case
1.基本语法
switch 语句用于判断条件有多个常量结果的情况。效率高一点点。
switch(表达式){
case 常量值1:
语句块1;
//break;
case 常量值2:
语句块2;
//break;
┇ ┇
case 常量值n:
语句块n;
//break;
[default:
语句块n+1;
]
}
2.执行过程
第1步:根据 switch 中表达式的值,依次匹配各个 case。如果表达式的值等于某个 case 中的常量值,则执行对应 case 中的执行语句。
第2步:执行完此 case 的执行语句以后,
- 情况1:如果遇到 break,则执行 break 并跳出当前的 switch-case 结构
- 情况2:如果没有遇到 break,则会继续执行当前 case 之后的其它 case 中的执行语句。—>
case穿透
- …
- 直到遇到 break 关键字或执行完所有的 case 及 default 的执行语句,跳出当前的 switch-case 结构
3.拓展
1.case 子句中的值必须是常量,不能是变量名或不确定的表达式值或范围。
2.同一个 switch 语句,所有 case 子句中的常量值互不相同。
3.如果没有 break,程序会顺序执行到 switch 结尾;一般 switch-case 结构中都要编写 break。
4.default 子句是可选的。同时,位置也是灵活的。当没有匹配的 case 时,执行 default 语句。
5.在 C 语言中,switch
语句中的case
标签后的代码块不需要使用大括号{}
来括起来,即使这个代码块有多条语句。这是因为switch
语句在C语言中是基于语句的,而不是基于表达式的。
6.switch 后面的表达式不能是浮点型,=只能是整型和字符型。
4.实例
使用 switch-case 实现:对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。
最简单写法:
int main() {
int score = 83;
//方式1:
switch(score / 10){
case 0:
printf("不及格");
break;
case 1:
printf("不及格");
break;
case 2:
printf("不及格");
break;
case 3:
printf("不及格");
break;
case 4:
printf("不及格");
break;
case 5:
printf("不及格");
break;
case 6:
printf("及格");
break;
case 7:
printf("及格");
break;
case 8:
printf("及格");
break;
case 9:
printf("及格");
break;
case 10:
printf("及格");
break;
default:
printf("成绩输入有误");
break;
}
return 0;
}
进一步优化(多个 case 分支对应同样的语句体):
int main() {
int score = 83;
//方式2:体会case穿透
switch(score / 10){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
printf("不及格");
break;
case 6:
case 7:
case 8:
case 9:
case 10:
printf("及格");
break;
default:
printf("成绩输入有误");
break;
}
return 0;
}
终极优化:
int main() {
int score = 83;
//方式3:算法层面优化
switch(score / 60){
case 0:
printf("不及格");
break;
case 1:
printf("及格");
break;
default:
printf("成绩输入有误");
break;
}
return 0;
}
错误写法:
int main() {
int key = 10;
switch (key) {
case key > 0 : //提示:Expression is not an integer constant expression
printf("正数");
break;
case key < 0:
printf("负数");
break;
default:
printf("零");
break;
}
return 0;
}
四、if-else与switch-case比较
凡是使用switch-case的结构都可以转换为if-else结构。反之,不成立。
如果既可以使用switch-case,又可以使用if-else,建议使用switch-case。因为效率稍高。
1.if-else语句优势
1.if 语句的条件可以用于范围的判断,也可以用于等值的判断,
使用范围更广
。
2.switch 语句的条件是一个常量值,只能判断某个变量或表达式的结果是否等于某个常量值,使用场景较狭窄
。
2.switch语句优势
1.当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用 if 和 switch 都可以,习惯上使用 switch 更多。因为
效率稍高
。当条件是区间范围的判断时,只能使用 if 语句。
2.使用 switch 可以利用穿透性
,同时执行多个分支,而 if…else 没有穿透性。