多路分支
Suzhou 556 0
#include <stdio.h>

int main()
{
    int type = 0;
    scanf("%d",&type);
    if(type == 1){
        printf("早安");
    }else if(type == 2){
            printf("午安");
    }else if(type == 3){
            printf("晚安");
    }
    return 0 ;
}

上述if-else程序在程序调试过程中,可以看到输入信息会和每一个条件进行比对,直到找到满足条件的输出对应信息。


用switch-case改写程序:

#include <stdio.h>

int main()
{
    int type = 0;
    scanf("%d",&type);
    switch (type){
        case 1:
            printf("早安");
            break;
        case 2:
            printf("午安");
            break;
        case 3:
            printf("晚安");
        break;
        default:
            printf("哦");
    }
    return 0;
}
2
午安
--------------------------------
Process exited after 1.397 seconds with return value 0

::: tip switch后的圆括号内为变量或者表达式,根据该变量值或表达式结果,在大括号内选择对应匹配的case并执行该case后的内容,直到遇到break为止,如果没有对应匹配的case,就执行default后面的内容。 ::: 使用程序调试功能可以看到switch-case程序在输入变量值后直接跳到对应匹配的case上,执行相应内容。


switch-case语句格式: 多路分支 ::: tip 上图中的控制表达式的结果只能是整数型,使用double类型会提示类型无效。 常量可以是一个数字,也可以是一个常数计算表达式。如上述程序的case 2可以改为case 1+1。 :::


::: warning switch语句是一种基于计算的跳转,计算控制表达式的值后,程序跳到相匹配的case(分支标号)处,分支标号只是说明switch内部位置的路标,执行完该该分支中最后一个语句后,如果没有break,程序会继续执行下一个case中的内容,直到遇到break或者switch结束。 即case只做标明匹配后程序开始执行的位置,break表示程序执行结束。 :::

#include <stdio.h>

int main()
{
    int type = 0;
    scanf("%d",&type);
    switch (type){
        case 1:
            printf("早安");
            break;
        case 2:
        case 3:
            printf("晚安");
        case 4:
            printf("再见");
            break;
        default:
            printf("哦");
    }
    return 0;
}
2
晚安再见
--------------------------------
Process exited after 1.293 seconds with return value 0

调试上述程序,当type = 2时,case 2后没有执行的内容,也没有break,程序继续执行case 3中的内容,没有break,程序继续执行case 4中的内容,遇到break停止。 ::: warning 正常情况下,需要为每一个case配一个break。 ::: 可以使用switch做级联的运算并且利用switch使用break做分隔而不是case的特性执行一些程序,如下:

#include <stdio.h>

int main()
{
    printf("输入成绩(0-100)\n");
    int grade;
    scanf("%d",&grade);
    grade /=10;
    switch ( grade ){
        case 10:
        case 9:
            printf("A\n");
            break;
        case 8:
            printf("B\n");
            break;
        case 7:
            printf("C\n");
            break ;
        case 6:
            printf("D\n");
            break;
        default:
            printf("F\n");
            break;
    }
    return 0;
}
输入成绩(0-100)
100
A

--------------------------------
Process exited after 1.785 seconds with return value 0

上述程序通过判断成绩的十位数来判断分数区间,当成绩为100分时,十位数为10,和十位数是9同样属于A级,case 10可以不用break,和case 9共用一个程序内容。 ::: tip 上述程序不符合“单一出口”的原则,可以通过字符串数据处理改造成“单一出口”。 :::


break可以写在case后面,如下:

#include <stdio.h>

int main()
{
printf("请输入月份:");int month;
scanf("%d",&month);
    switch ( month ){
        case 1: printf("January\n"); break;
        case 2: printf("February\n"); break;
        case 3: printf("March\n"); break;
        case 4: printf("April\n"); break;
        case 5: printf("May\n"); break;
        case 6: printf("June\n"); break;
        case 7: printf("July\n"); break;
        case 8: printf("August\n"); break;
        case 9: printf("September\n"); break;
        case 10: printf("October\n"); break;
        case 11:printf("November\n"); break;
        case 12:printf("December\n"); break;
    }
    return 0;
}
请输入月份:9
September

--------------------------------
Process exited after 3.564 seconds with return value 0

使用switch语句写分段函数x<0,fx=-1;x=0,fx=0;x>0,fx=2x:

#include <stdio.h>

int main() 
{
    int x, fx; 
    scanf("%d", &x);    
    switch(x > 0){
        case 1: fx = 2*x; break;
        case 0:
            switch(x < 0){
                case 1: fx = -1; break;
                case 0: fx = 0; break;
            }
    }
    printf("%d\n", fx);    
    return 0;
}

上述程序中,第七行程序先判断x是否大于0,x>0则判断结果为1,执行case 1后的语句,遇到break停止。x<=0则判断结果为0,执行case 0后的语句,即继续使用switch继续判断表达式x<0,x<0则判断结果为1,执行case 1后的语句,遇到break停止。x不大于0也不小于0(x=0)时,执行case 0后的语句,遇到break停止。

评论区