分支和循环之switch详解(二)

        继上一篇文章,留下了switch语句的悬念,现在让我们来揭开它的面纱。

switch语句格式

switch(表达式)
    {
    case 常量1:
        程序段1;
    case 常量2:
        程序段2;
        .
        .
        .
    case 常量n:
        程序段n;
    default:
        程序段n+1;
    }

        这就是switch语句在程序中的样子。看到它,你应该和我有一样的感受,对没错,就是它的结构感特别强,这也是我对switch语句最大的感受。

        举个最简单的例子,假如“switch”是一个星期,后面的括号指代着某一天,括号内会包括7个case语句和一个default语句,分别对应着星期一到星期日,还有一个处理输入异常数据的部分:

int input = 0;
scanf("%d",&input);
switch(input)
{
  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("明知道是在说星期,就不要输入除1-7之外的数字啦!\n");
}
    

        看起来还不错吧,是不是一目了然,大功告成!了么?稍后再说,先让我们解析一下switch语句中的一些细节:

        1、根据语法格式,case语句后面要跟常量,既然是常量,那就包括常量整形和常量字符。包不包括常量字符串呢(java中是可以的哦)?可以自己去试验一下。

        2、可以看出,每一个case都代表着你想表达的内容的各个不同情况,既然是不同,那么,各个case后面的常量值必须互异

        3、其实case分支中的程序段还有一个特点的,可是上述代码没有体现出来,稍后再说。

        4、说到这一点,我想问一下,上面的代码真的大功告成、天衣无缝了么?并不是,不信你可你可以去自己运行一下,会出现你意想不到的效果。

        switch语句也是一个分支,那么得到的答案应该是其中的一个,可是,上述代码并没有语句来退出switch,他就会从你选择到的分支顺着代码往下执行一直到switch语句结束,这显然不是我们想要的结果,所以这个时候就需要我们使用break(它也是一个关键字哦,不要试图用这个名字来创建变量!)语句,来退出switch!

int input = 0;
scanf("%d",&input);
switch(input)
{
    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("明知道是在说星期,就不要输入除1-7之外的数字啦!\n");
}

        这回看着就舒服多了,没错,这回真的大功告成了!

        这时候,我们再说回第三点,我们都知道C语言编写代码时的一个规范,一个代码块里要是只有一条语句,则可以省略大括号;若是超过了两条,那就必须用大括号括起。我们把这个规范拿到上述代码中我们可以发现,case后面的代码块,共有两条语句,为什么不把他括起来?

        原因很简单,因为:case分支中的程序段可包含多条语句,且不用“{}”

        5、可以看到里面除了一堆case还包括一个default,英译汉:默认,没错,他就是默认情况,默认着你输入的内容和每一个case都对应不上的情况,这么说就很好理解了吧!

        6、最后一点了,真的最后一个特点了,没想到如此简单的switch语句能写出这么多内容吧。还记得我们为什么要用break来结束switch语句么?那我们可不可以利用那一点去完成一些别的功能呢?当然可以,因为,多个case可以共用同一个程序段呀:

//1年分12个月,12个月分为4个季度
switch(month)  //1-12
{
case 1:
case 2:
case 3:
    printf("一、二、三月是一年的春季\n");
    break;
case 4:
case 5:
case 6:
    printf("四、五、六月是一年的夏季\n");
    break;
case 7:
case 8:
case 9:
    printf("七、八、九月是一年的秋季\n");
    break;
case 10:
case 11:
case 12:
    printf("十、十一、十二月是一年的冬季\n");
    break;
default:
    printf("一年就十二个月,不要输入除1-12的其他数字,要不我会笑话你的!\n");
}

        一目了然吧,可以自己尝试着写一下哦!

        但是这里我要提出一个疑问,它虽然有着让人一目了然的结构性,但是是不是代码的篇幅有些过于冗长了?它和if语句的区别是什么呢?

        要我说,没区别,就是具体情况具体分析,当然采用哪种分支语句都是可以的,存在即合理。

        考虑一下,模拟一个简易计算器,用户输入两个数字和一个运算符,实现+、-、*、/的计算,这时候你会采用if语句还是switch语句呢?

        

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值