[详解C语言]一文带你玩转选择(分支)结构

为什么要学习选择结构

大家都知道,程序是为了解决生活中的问题,而生活中处处是选择,例如:
image.pngimage.png

对于这种我只想说

image.png

好了,话不多说,进入正题

image.png

到了现在这个年纪,这个选择早就已经过去,很不幸,我选的是右边这个,如果有初高中的同学看到此篇文章,此路不通。
生活处处是选择,所以在程序中要有对应的结构来实现,这便是今天的主角。
选择结构分为两种实现,各有特点 if else / switch case

if else 详解

1.将上图用代码实现

#include <stdio.h>

int main(void){
   
    int input = 0;
    //好好学习输入1  天天打游戏输入2
    
    printf("好好学习输入1 \n 天天打游戏输入2");
    scanf("%d",&input);
    if(1 == input){
        printf("上岸985/211);
    }else{
        printf("大专/普通本科");
    }
    
    return 0;
}

解析: 这就是最简单的if - else 结构, if 一个分支 ,else 一个分支, 只会走其中一条路线

2.注意事项 : else匹配问题 —> 悬空else

话不多说,直接上代码

#include <stdio.h>

int main(void){
    int a = 2;
    int b = 3;
    int c = 4;
    if(a > b)
        if(b < c){
            printf(" b < c ");
        }
    else{
        printf(" 呵呵 ");
    }
    
    return 0;
}

上述代码,大家认为的运行结果是什么呢?
打印 b< c?
还是只打印 呵呵

可能出乎你的意料,看结果
image.png

结果什么也没有打印

解析: else是和它离的最近的if匹配的,并且此if没有被其他else匹配
可能大家还没有理解,把代码缩进一下就明白了
image.png
else和这个if相结合,因为a>b为假,所以什么也不输出

3.典型案例 : 输入年龄,判断状态

eg: 18岁以下为少年 ,18~35为青年 , 35~60中年 60以上为老年
输入年龄,输出状态

#include <stdio.h>

int main(void){
    int age = 0;
    scanf("%d",&age);
    if(age <= 18)
        printf("少年);
    else if(age > 18 && age <= 35)  //可以直接写成这样( age <= 35) 读者可以自行琢磨
        printf("青年");
    else if(age > 35 && age <= 60)
        printf("中年");
    else 
        printf("老年");
    
    return 0;
}

简单看出,if - else 结构适合范围类型的选择

如果有这样一个案例 :

如果输入1 表示星期1 , 2 表示星期二 …1 -7 输出 星期一-七

我们当然可以使用if-else来实现
image.png

有没有觉得简单而又冗余的逻辑,一篇有一篇,这只是7个,如果更复杂的呢?

所以让我们来看一下 swith -case 结构

switch-case详解

1.将if-else结尾的需求用switch-case实现

#include<stdio.h>
int main(void) {
    int num = 0;
    scanf("%d", &num);
    switch (num) {
        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;
    }
    return 0;
}

看起来是不是好多了,swith-case 更适合于处理具体数据的选择,

2.switch-case注意事项

让我们来看看switch的注意事项吧

2.1 switch后边的括号只能是 整形表达式(包括短整/长整) 或者 字符型

image.png

这是一个最基本的switch结构
1.switch是把括号中变量的值(即1处) 去下边case所列举的值去匹配
如果成功匹配,执行3处的语句
如果匹配不上,那就成顺序结构 ,啥也不干

case后必须是整型常量表达式
image.png

2.设想一下: 如果可以为浮点型的话
那么,3.14 可以匹配的有: 3.140 , 3.1400 , 3.14000…
故只能为整形或字符型

这就有人问了,为什么可以是字符型呢?
字符型在内存中以ASCII码的形式存储,简单来说,就是一个字符对应一个数字
所以说,字符可以说是特殊的整形

2.2switch中的default

image.png

这段代码中,如果输入不是 a / b ,那产生的结果是什么呢
显然,default代表默认,意味着如果所有的case子句都匹配不上的话,就执行default下的语句

注意: 与default的位置无关,default子句可以放在开头,或者case子句之间,也可以是结尾

2.3 break

在前边的switch-case子句中,基本都出现的break子句,为什么呢

再匹配到一个case子句执行完了,如果不执行break,会继续向下执行,直到碰到break或者到结尾才会跳出
image.png

这个代码就可以看出,我输入的是a ,但是 把下面所有的结果都输出来了,这是一个非常要注意的地方
一定要添加break子句

case后边的值决定从哪里进去,而break决定从哪里出去

我们有时可以利用这个小技巧

eg: 判断小写字母是否为元音字母

int main(void) {
    char ch = getchar();
    switch (ch) {
        case 'a': 
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            printf("是元音字母");
            break;
        default:
            printf("不是元音字母 ");
    }
    return 0;
}

多个值为一个处理结果的时候,可以起到很大的帮助

switch-case嵌套

#include <stdio.h>
int main() {
    int m = 1;
    int n = 3;
    switch (m) {
        case 1:
            m++;
        case 2:
            n++;
        case 3:
            switch (n)
            {//switch允许嵌套使用
            case 1:
                n++;
            case 2:
                m++;
                n++;
                break;
            }
        case 4:
            m++;
            break;
        default:
            break;
    }
    printf("m = %d, n = %d\n", m, n);
    return 0;

}

大家可以计算一下这个,学校一般爱考这种题,注意是否有break就可以

总结

接下来我们使用 if - else 和switch-case 实现同一个案例

输入整数分数,60分 以下不及格,60-70 及格 70 -80 80-90 良好 90-100优秀

使用if-else实现

#include <stdio.h>
int main(void) {
    int score = 0;
    scanf("%d", &score);
    if (score < 60)
        printf("不及格");
    else  if (score < 70)
        printf("及格");
    else  if (score < 80)
        printf("中等");
    else  if (score < 90)
        printf("良好");
    else
        printf("优秀");
    return 0;
}

使用switch-case实现

int main(void) {
    int score = 0;
    scanf("%d", &score);
    switch (score / 10) {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            print("不及格");
            break;
        case 6:
            printf("及格");
            break;
        case 7:
            printf("中等");
            break;
        case 8:
            printf("良好");
            break;
        case 9:
        case 10:
            printf("优秀");
        }
    return 0;
}

综上

以上对比显而易见,并无优劣,各有千秋,谁好用用谁
个人观点如下

  1. 碰到范围类型的选择,优先考虑 if-else
  2. 碰到具体数据的选择,优先考虑switch-case,switch-case最大缺陷是只能整型

注:

  • 本文所有见解,为本人拙见,如有误导,请多指教
  • 如果对您有所帮助,点赞支持一下
  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值