C语言分支技巧:条件语句与switch用法
C语言分支技巧:条件语句与switch用法
C语言的分支结构是程序设计中的重要组成部分,它允许程序根据不同的条件执行不同的代码块。本文将详细介绍C语言中的两种主要分支结构:if语句和switch语句,并通过具体的代码示例帮助读者理解它们的使用方法。
一、if语句
1.1、if
- if语句的语法如下:
if(表达式)
语句
在C语言中,0表示假,非0表示真。也就是说,在if语句中,如果表达式的结果为0,则语句不执行;如果表达式的结果不是0,则语句执行。
根据这个语法,可以写出如下程序:
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 0)
printf("%d是偶数\n", num);
return 0;
}
这个程序的作用是判断输入的数是否为偶数。
1.2、else
上面的程序还不够完整,偶数的判断部分是有了,可是奇数呢?这时候就需要我们的if…else…语句了。
- 语法:
if(表达式)
语句1
else
语句2
那么根据语法改进的代码如下:
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 0)
printf("%d是偶数\n", num);
else
printf("%d是奇数\n", num);
return 0;
}
1.3、if else多条语句包含
if和else默认都只能跟一条语句,如:
int main()
{
int num = 0;
printf("命运石之门0中凶真为了从未来回到现在经历了多少次时间跳跃?\n");
scanf("%d", &num);
if(num == 3000)
printf("回答正确\n");
printf("El Psy Kongroo!\n");
}
运行代码可以发现,不管输入的值是否等于3000都会输出“El Psy Kongroo!”
if语句仅直接作用于其后的第一条语句,即
printf("回答正确\n");
而
printf("El Psy Kongroo!\n");
是独立于if语句的,因此不受其条件控制。如果想同时控制两条语句,则需要在if语句后面加上{ }将代码括起来。如下:
int main()
{
int num = 0;
printf("命运石之门0中凶真为了从未来回到现在经历了多少次时间跳跃?\n");
scanf("%d", &num);
if (num == 3000)//像这样将代码括起来的而形成的块,叫做代码块或复合语句
{
printf("回答正确\n");
printf("El Psy Kongroo!\n");
}
}
else语句也同样适用,如:
int main()
{
int num = 0;
printf("命运石之门0中凶真为了从未来回到现在经历了多少次时间跳跃?\n");
scanf("%d", &num);
if (num == 3000)
{
printf("回答正确\n");
printf("El Psy Kongroo!\n");
}
else
{
printf("回答错误\n");
printf("回去补番!\n");
}
}
1.4、else if嵌套
在if else语句中,可以将一个if语句放在else部分,以此来构筑多级的条件判断。
if(表达式1)
语句1
else if(表达式2)
语句2
else
语句3
进入分支,如果表达式1成立,则输出语句1并跳过后续部分;若不成立,则判断表达式2是否成立;成立输出语句2,不成立输出语句3。
举个例子:
int main()
{
int num = 0;
printf("命运石之门0中凶真为了从未来回到现在经历了多少次时间跳跃?\n");
scanf("%d", &num);//输入一个数字
if (num == 3000)//等于3000
{
printf("回答正确\n");
printf("El Psy Kongroo!\n");
}
else if(num > 3000)//大于3000
{
printf("意料之中的回答,果然一切都是命运石之门的选择\n");
printf("El Psy Kongroo!\n");
}
else
{
printf("回答错误\n");
printf("回去补番\n");
}
}
上述代码中,else if里的if相当于嵌套在了else语句中,形成了嵌套结构。
当然,if语句中也能在嵌套一个或多个if或else if语句,形成一些更加复杂的逻辑判断。
比如:
int main()
{
int num = 0;
printf("命运石之门0中凶真为了从未来回到现在经历了多少次时间跳跃?\n");
scanf("%d", &num);
if (num >= 3000)//先判断大于等于3000的数
{
if (num == 3000)//再判断是否等于3000
{
printf("回答正确\n");
printf("El Psy Kongroo!\n");
}
else
{
printf("意料之中的回答,果然一切都是命运石之门的选择\n");
printf("El Psy Kongroo!\n");
}
}
else
{
printf("回答错误\n");
printf("回去补番\n");
}
}
1.5、悬空else
经过上面的学习,让我们来看看这个代码
int a = 10;
if (a == 20)
if (a == 10)
printf("Hello world\n");
else
printf("Good night world\n");
运行后:
为什么会造成这种结果呢?
这就是else悬空问题,else只会与距离最近的if匹配。而上面代码的这种排版让我们误以为else是与第一个if匹配,当第一个if语句不成立时,自然就想到了else,结果是什么都没输出。原因是else与第二个if进行了匹配,相当于后面if…else语句嵌套进了前面的if语句:
int a = 10;
if (a == 20)
{
if (a == 10)
printf("Hello world\n");
else
printf("Good night world\n");
}
如果想让第一个if与else匹配,可以这么改:
int a = 10;
if (a == 20)
{
if (a == 10)
printf("Hello world\n");
}
else
{
printf("Good night world\n");
}
我们以后在写代码时要注意括号的使用,因为只要带上适当的大括号,代码的逻辑就会更加清晰,这样良好的代码风格能够大大提高代码的可读性。
二、switch语句
除了if语句外,C语言还提供了switch语句来实现分支结构。switch 语句实际上是一种改进版的 if…else 链,专门用于处理多个可能的条件分支。它将一连串的 else if 语句转换成一种更加简洁和易于理解的形式,使得代码在处理不同情况时更加直观。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
遇到的陌生单词很多,先来个简单的例子结合看看:
int main()
{
int n = 0;
scanf("%d", &n);
switch (n)
{
case 1:
printf("haha\n");
case 2:
printf("hehe\n");
default:
printf("xixi\n");
}
}
根据例子不难看出,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
需要注意:
- switch 后的 expression 必须是整型表达式
- case 后的值,必须是整形常量表达式
- case和后面的数字之间必须空格
2.1、switch语句中的break
当我们运行上面的代码并输入1:
可以发现所有的语句都被执行了
这是switch语句其特有的“fall-through”行为。是指在一个 switch 语句中,如果没有遇到 break 语句,代码会继续执行下一个 case 分支,不论下一个 case 的条件是否匹配。
加上break语句后:
int main()
{
int n = 1;
scanf("%d", &n);
switch (n)
{
case 1:
printf("haha\n");
break;
case 2:
printf("hehe\n");
break;
default:
printf("xixi\n");
}
}
2.2、switch语句中的default
当使用 switch 语句时,常见的情况是表达式求得的值与任何一个 case 标签都不匹配。在这种情况下,我们通常有两个选择:要么忽略这种情况不做任何操作,要么在 switch 语句中包含一个 default 子句来处理所有未匹配的情况。
还是上面的代码:
int main()
{
int n = 1;
scanf("%d", &n);
switch (n)
{
case 1:
printf("haha\n");
break;
case 2:
printf("hehe\n");
break;
default:
printf("xixi\n");
}
}
在输入的值不是1或2时,就会执行default子句,如图:
2.3、default子句和case子句的顺序问题
在switch语句中,default子句和case子句是没有顺序要求的,只要代码的顺序满足实际的需求就可以。
一般是将default子句放在最后,若要改变子句的位置,可以加上break语句,以避免因fall-through导致的意外行为。
三、练习
3.1、if语句的应用
请使用if语句写出如下要求:
输入一个人的年龄
如果年龄<18岁,打印"未成年"
如果年龄在18岁至44岁打印"青年"
如果年龄在45岁至59岁打印"中老年"
如果年龄在60岁至89岁打印"老年"
如果90岁及以上打印"老寿星"
3.2、switch语句的应用
请使用switch语句写出如下要求:
输入1~7的数字,打印对应的星期;输错时,提示错误信息
例如:
输入:1 输出:星期一
输入:2 输出:星期二
输入:3 输出:星期三
……
输入:其他值 输出:输入错了,请重新输入
参考代码
3.1
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年\n");
else if (age <= 44)
printf("青年\n");
else if (age <= 59)
printf("中老年\n");
else if (age <= 89)
printf("老年\n");
else
printf("老寿星\n");
}
3.2
int day = 0;
scanf("%d", &day);
switch (day)
{
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;
default:
printf("输入错误,请重新输入");
}