问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言选择结构详解:if语句与switch语句的使用方法

创作时间:
作者:
@小白创作中心

C语言选择结构详解:if语句与switch语句的使用方法

引用
CSDN
1.
https://blog.csdn.net/Nightmare1000/article/details/136794113

在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语言中,有关选择结构的全部知识,如有遗漏,欢迎补充。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号