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

C语言分支技巧:条件语句与switch用法

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

C语言分支技巧:条件语句与switch用法

引用
CSDN
1.
https://blog.csdn.net/kuki815/article/details/145064218

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 分支。

需要注意:

  1. switch 后的 expression 必须是整型表达式
  2. case 后的值,必须是整形常量表达式
  3. 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("输入错误,请重新输入");
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号