分支语句
if
switch
分支语句(选择结构)
if 语句
语法结构:
1 单分支结构
if(表达式)
语句;
若表达式为真则执行语句,否则不执行语句。
例如:
#include<stdio.h>
//输入两个数字,找出其中的较大值
int main()
{
int a = 0, b = 0;
printf("请输入两个数字:");
scanf("%d %d",&a, &b);
if(a < b)
{
a = b;
}
printf("两个数的较大值为 %d", a);
return 0;
}
运行结果:
2 双分支结构
if (表达式)
语句1;
else
语句2;
若表达式为真则执行语句1 ,否则执行语句2.
例如:
#include<stdio.h>
int main()
{
int coding = 0;
printf("你会好好学习编程吗?(选择1 or 选择0):");
scanf("%d", &coding);
if(coding == 1)
{
printf("坚持下去,你会有一个好offer\n");
}
else
{
printf("放弃,你会付出很大代价的!\n");
}
return 0;
}
运行结果:
3 多分支结构
if(表达式1)
语句1;
else if (表达式2)
语句2;
else if(表达式3)
语句3;
else
语句4;
若表达式1为真这执行语句1,若表达式2为真则执行语句2,以此类推只执行一个语句。
例如:
#include<stdio.h>
int main()
{
int age = 0;
printf("请输入你的年龄,粗略判断你的年龄段:");
scanf("%d",&age);
if(age <= 18)
{
printf("青少年");
}
else if(age <= 65)
{
printf("成年");
}
else
{
printf("老年");
}
return 0;
}
运行结果:
,
注意事项:
1 C语言中真假的表示:0表示假,非0表示真。
2 如果条件成立 ,要执行多条语句则需要使用代码块,否则只能执行第一条语句。
使用范例:
#include<stdio.h>
int main()
{
if(表达式)
{
语句列表;
}
else
{
语句列表;
}
return 0;
}
3 悬空else,else只会与其最近的未匹配的 if 匹配
例如:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hello\n");
else
printf("hi\n");
return 0;
}
运行结果:
什么也没有!
原因:由于格式的对齐容易让人认为 else 是与第一个 if 匹配的,但由于在C语言中 else 会与其最近的 if 匹配
if()
if()
printf();
else
printf();
//其上格式等价于
if()
{
if()
printf();
else
printf();
}
第一个 if 根本上就没有判断成功,不可能执行以下语句。
改正:
//适当使用{}可以使代码的逻辑更加清晰
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if(a == 1)
{
if(b == 2)
{
printf("hello!\n");
}
}
else
{
printf("hi!\n");
}
return 0;
}
4 常量与变量比较相等时,常量放左,变量放右(减少错误)
比较时采用常量放左变量放右,若将" == " 误写成" = "编译器会自动报错。
2 switch语句
switch 语句常用于多分支的情况。当我们写成 if...else if ... else if 的形式太复杂,我们就会考虑使用 switch 语句。
结构形式:
switch(整形表达式)
{
语句项;
}
语句项是一些 case 语句:
case 整形表达式:
语句;
switch 语句通过搭配使用break才能真正的实现分支。
#include<stdio.h>
int main()
{
int day = 0;
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;
}
return 0;
}
运行结果:
现在改变需求:
1.输入1-5输出的是"工作日"
2.输入6-7输出的是"休息日"
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
运行结果:
break 语句的实际效果是把语句列表划分为不同的部分。
default 子句(一般用于非法输入)
default 写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
练习:
#include<stdio.h>
//求运行结果 m 和 n 的值
int main()
{
int n = 1;
int m = 2;
switch(n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch(n)
{
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n",m,n);
return 0;
}
运行结果:
过程: