C语言选择结构详解:if语句与switch语句的使用方法
C语言选择结构详解:if语句与switch语句的使用方法
在C语言编程中,选择结构是控制程序流程的重要工具之一。它允许程序根据特定条件的测试结果来决定下一步的操作。本文将详细介绍C语言中的两种主要选择结构:if语句和switch语句,并通过具体示例帮助读者掌握它们的使用方法。
3.1 if语句
C语言中的if语句可以实现基本的选择结构功能,有3种表现形式,且用处各不相同,下面对其一一进行介绍。
3.1.1 单分支选择结构
if语句可以实现单分支选择结构,语法格式如下:
if (表达式)
语句;
其表达的意思,可以用下面这幅图来理解:
这样,即可实现一种简单的选择结构,当程序执行到if语句时,会先判断表达式为真还是假,如果为真,则执行对应的语句,如果为假,则会直接跳过这条语句。
下面举一个简单的例子:
#include <stdio.h>
int main()
{
int age=19;
if (age>=18) //对年龄进行判断
printf("恭喜你,成年了"); //判断结果为真,则将这条消息打印在屏幕上
return 0;
}
3.1.2 双分支选择结构
根据上面的例子,如果年龄超过18岁,则会输出对应信息,年龄没有超过18岁,屏幕上什么也不会输出。那么想让年龄未超过18岁时,也输出对应的信息该怎么做呢?其实,只需要加上else语句,即可实现双分支结构。语法格式如下:
if (表达式)
语句;
else (表达式)
语句;
其对应的表达意思,可以辅以下面这幅图来理解:
有了else语句,可以对上面的代码进行一些优化:
#include <stdio.h>
int main()
{
int age=19;
if (age>=18) //对年龄进行判断
printf("恭喜你,成年了\n"); //判断结果为真,则将这条消息打印在屏幕上
else
printf("很遗憾,你还未成年\n"); //判断结果为假,则将这条消息打印在屏幕上
return 0;
}
这里需要注意的是,每一个if或者else语句,只能控制它后面的一条语句,如果想让它们同时控制多条语句,需要加上花括号:
#include <stdio.h>
int main()
{
int age=19;
if (age>=18) //对年龄进行判断
{
printf("恭喜你,成年了\n"); //判断结果为真,则将以下消息打印在屏幕上
printf("可以谈恋爱了\n");
}
else
{
printf("很遗憾,你还未成年\n"); //判断结果为假,则将以下消息打印在屏幕上
printf("期待你成年的那一天\n");
}
return 0;
}
注意,if语句括号里的表达式,无论表达式计算的结果为多少,真实结果只有1和0两种,即如果表达式的内容成立,则返回1,1表示真,表达式不成立,则返回0,0表示假。表达式判断所使用的操作符,可以是>=,==,<=,&&,||等,不过再判断表达式两端的内容是否相等时,应使用“==”,而非“=”,一个“=”表示的是赋值操作符,放在表达式的位置,由于语法格式没有错误,编译器并不会报出警告,使用时应当格外注意。
3.1.3 多分支选择结构
通过上面的引例,可以实现简单的双分支选择结构,如果想要实现多条分支的选择结构,则需要使用else if语句,其基本语法格式如下:
if (表达式)
{
语句;
}
else if (表达式)
{
语句;
}
else
{
语句;
}
将上面的语法格式,同样可以用一张图去辅以理解:
我们还可以继续对上面的代码进行加工,使其根据具体的年龄范围输出对应信息:
#include <stdio.h>
int main()
{
int age=0;
printf("请输入你的年龄:\n");
scanf("%d",&age); //从键盘输入,获取用户的年龄
if (age>=18&&age<35) //对年龄进行判断
printf("青年\n");
else if (age>=35&&age<50)
printf("中年\n")
else if (age>=50&&age<65)
printf("老年\n");
else if (age>=65)
printf("老寿星\n");
else
printf("未成年\n");
return 0;
}
3.1.4 选择结构的嵌套
if…else语句之间是可以相互嵌套的,if语句里面也可以再次嵌套一层if语句,大致的语法格式如下:
if (表达式)
{
if (表达式)
{
语句;
}
else
{
语句;
}
}
else
{
if (表达式)
{
语句;
}
else
{
语句;
}
}
这种嵌套模式可以辅以下面的结构图来理解:
这里就不给出具体的选择结构嵌套得例子了,读者可以自行去尝试一下,但应当用大括号,将嵌套结构表达清楚,明确,不然很容易出现bug。
3.1.5 else悬空问题
下面来看一段代码:
#include <stdio.h>
int main()
{
int a=0,b=2;
if (a==1)
if (b==2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这段代码在执行后,屏幕上会显示什么呢?答案是,什么都不显示!这就是悬空else问题。如果程序中有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。上面的代码,第一个if与else是对齐的,很容易让我们误以为else是与第一个if语句对齐的,但根据刚刚给出的规则,实际上else是与第二个if语句对齐的,所以,这段代码实际上是一个选择结构的嵌套,程序先判断第一个if语句后面的表达式,表达式不成立,程序直接就结束了,压根没进入到第一层选择结构里面,所以,实际上代码的结构应该是下面这样的:
#include <stdio.h>
int main()
{
int a=0,b=2;
if (a==1)
{
if (b==2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
3.2 switch语句
接下来介绍C语言中另外一种选择结构,switch语句。在介绍之前,先给出一个例子:
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
if (n==1)
printf("星期一\n");
else if (n==2)
printf("星期二\n");
else if (n==3)
printf("星期三\n");
else if (n==4)
printf("星期四\n");
else if (n==5)
printf("星期五\n");
else if (n==6)
printf("星期六\n");
else if (n==7)
printf("星期日\n");
else
printf("输入错误,请重新输入\n");
return 0;
}
可以看出,这段代码的作用是,从用户输入接收一个整数,根据数据内容,输出对应的天数,如果使用if…else语句写起来,会比较麻烦,分支内容过于多,那么有没有更好的办法,实现这一功能呢?当然可以,用switch语句就可以解决上面代码过于复杂的问题。下面先给出switch语句的大致语法:
switch (表达式)
{
case 常量1:语句1;
case 常量2:语句2;
case 常量3:语句3;
...
case 常量n:语句n;
default:语句n+1; //根据需要,这条语句可有可无
}
这个语法的规则,大招是,根据switch后面表达式的结果,去匹配下面的常量,一旦匹配上了,就执行后面的语句,没有匹配上,就执行default后面的语句,可以辅以下面的图来理解:
下面,我们用switch语句,对上面的代码进行改进:
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
switch (n)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期日\n");
default:
printf("输入错误,请重新输入\n");
}
return 0;
}
这样,代码的逻辑看上去就很清晰了,也不会出现代码冗余的情况,下面我们来运行一下这段代码:
看出问题在哪里了吗?我们再运行一次看看:
可以看到,当case后面的某个常量与switch后面的表达式匹配上的时候,后面的语句就会全部输出出来,就相当于,switch拿着一把钥匙,把对应匹配上常量的那条case语句的门打开了,后面的门就会自动全部打开。那么如何解决这个问题呢?使用break语句就可以解决这个问题。break语句有两个作用,一个是跳出switch语句,另一个则是跳出循环,后面会讲到,那么我们现在就使用break语句,继续对上面的代码进行调整:
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
switch (n)
{
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;
default:
printf("输入错误,请重新输入\n");
break;
}
return 0;
}
这样子就算改进完成了,下面我们再运行一下代码,看看能否达到想要的效果:
成功运行。
3.3 程序举例
下面通过两个例题,来实战体验选择结构程序设计在解决实际问题中的应用。
例1:输入开学的原日期(星期几)和延期几天,输出一个数字,表示开学日期是星期几。
示例:
输入:1 2 输出:3
输入:5 9 输出:7
分析:通过两个示例可以看出,如果两数相加在7以内,直接相加即可输出结果。不过一旦超过了7,该怎么处理呢?这里要用到一个操作符的性质,就是%取余。不管两数相加的结果是小于7还是大于7,将结果进行取余后,得到的数必然是7以内的,而当取余结果为0时,就说明两数相加结果正好为7的倍数,输出7即可。
#include <stdio.h>
int main()
{
int a=0, b=0;
scanf("%d%d",&a,&b);
if ((a+b)%7==0)
printf("%d",7);
else
printf("%d",(a+b)%7);
return 0;
}
运行结果:
例2:从用户输入接受任意一个年份中的任意一个月份,判断该月有多少天
分析:一年中一共有12个月,其中,1,3,5,7,8,10,12都是31天,4,6,9,11都只有30天,而2月份是最特殊的一个月份,它的天数是根据该年是不是闰年所决定的。那么闰年该怎么判断呢?有一个口诀:四年一闰,百年不闰,四百年一闰。翻译成数学语言就是,一个年份,既可以被4整除,同时又不能被100整除,它就是闰年。或者该年份可以直接被400整除,那它也是闰年。到这里思路已经比较清晰了,下面附上我的代码:
#include <stdio.h>
int main()
{
int year=0,month=0;
printf("请输入你想要查询的年份及其对应的月份:\n");
scanf("%d%d",&year,&month);
//先判断月份是不是2月,对2月进行特殊处理
if (month==2)
{
//判断该年是否是闰年
if ((year%4==0&&year%100!=0)||year%400==0)
{
printf("该月一共有29天\n");
return 0;
}
else
{
printf("该月一共有28天\n");
return 0;
}
}
//不是2月份,就正常进行处理
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("该月一共有31天\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("该月一共有30天\n");
break;
default:
printf("错误的月份,请重新输入\n");
break;
}
return 0;
}
这个例题基本上涵盖了C语言中有关选择结构的所有语法,当然,后续学了其它的语法结构,这个代码还可以继续进行简化。我的代码不一定是最简洁的,但我想代码的逻辑应该是比较清晰的。
以上便是C语言中,有关选择结构的全部知识,如有遗漏,欢迎补充。