C语言中switch语句的思考

switch语句是C语言中提供的一种用于多分支选择的语句 其基本用法如下;

switch(表达式){ 
    case 常量表达式1:  语句1;
    case 常量表达式2:  语句2;
    … 
    case 常量表达式n:  语句n;
    default:  语句n+1;
}

其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。其中表达式的值可以是int,byte,char,short, enum这几种。

然而其在当表达式的值与某个常量表达式的值相等时, 将会执行其后全部的语句。这一点有时会产生不少错误。因此通常我们会在每个case的语句后加入一个break来跳出switch语句避免此后的语句被执行。


但是,这是为什么呢?为什么此后的语句会全部被执行?

在很多C语言教程中,switch语句后面跟着的一般都是臭名昭著的goto语句,而课本的这种安排方式是合理的,因为在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。

让我们看一段含有goto语句的代码

#include"stdio.h"
int main(void)
{
int n=0;
printf("input a string :\n");
loop: if(getchar()!='\n')
{
n++;
goto loop;
}
printf("%d",n);
}

再看看switch语句的

#include <stdio.h>
int main(void){
    int a;
    printf("input integer number:    ");
    scanf("%d",&a);
    switch (a){
        case 1:printf("Monday\n");  break;
        case 2:printf("Tuesday\n");   break;
        case 3:printf("Wednesday\n");  break;
        case 4:printf("Thursday\n");  break;
        case 5:printf("Friday\n");  break;
        case 6:printf("Saturday\n");  break;
        case 7:printf("Sunday\n");  break;
        default:printf("error\n");
    }
    return 0;
}

两者完全相似,由于没学过汇编所以没法直接对比两者的汇编代码,不过估计实现方式是一样的。

因此,这样子的代码也是合理的了。

#include <stdio.h>
int main(void){
    int a;
    printf("input integer number:    ");
    scanf("%d",&a);
    switch (a){
        case 1:case 3printf("123\n");  break;
        case 2:case 4:case 5printf("456\n");   break;
        default:printf("789\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值