在有多个选择分支条件的情况下,用if 语句难免会繁琐且效率不高,此时便是switch语言的用武之地。

     int  i=1;

     switch(i)

{

    case 0:

             printf("0");

    case 1:
            printf("1");

    case 2:

           printf("2");

    default:

           printf("default");

}

     有些人会认为运行的结果是 2, 但是实际情况是  12default.

     这也是初学者常犯的错误。按照常理,switch是选择分支,即满足那个case 执行那个case 块的语句,但是C语言中的switch有它的个性。来看看MSDN 的定义。

     You can use the break statement  to end processing of a particular case within the switch statement and to branch to the end of the switch statement. Without break,the program continues to the next case, executing the statements until a break or the end of the statement is reached. In some situations, this continuation may be desirable。

     意思是,用break 语句 终止 当前的case ,直接到达switch 的末尾,执行完当前case 若有break则跳出switch。

     如果没有break, 程序继续流向下一个case ,直到遇到break,或者 到达了switch末尾。

     所以如果没有break语句,找到匹配条件的case 后,会从这里继续执行下面的case 直到最后一个case 或default。

     明白了这个我们在上面的代码应该这样写。

        int  i=1;

     switch(i)

{

    case 0:

             printf("0");

            break;

    case 1:
            printf("1");

           break;

    case 2:

           printf("2");

          break;

    default:

           printf("default");

          break;

}

     这样就会输出  1;

     一定要养成良好的习惯,给每一个case 加上break,以免造成疏忽的错误。

     但是C语言的这种switch 特性也有它的优点。

     比如设置每一个月的天数 Days 可以这样用switch

     switch(month)

 {

     case 1:

     case 3:

      case 5:

      case 7:

     case 8:
     case 10:

      case 12   :

                  Days=31;

                  break;

     case 2:

                //根据是否是闰年判断。

               break;

      case 4:

       case 6:

      case 9:

        case 11:

                     Days=30;

                    break;

     default:    break;

}

    这样便不用给每个case 都写语句了,case 1 3 5  7 为空,会自动到下一个CASE ,知道case 12 ,执行完跳出。

   关于 defaut的位置。

    这个问题相信有一大部分人没有考虑过,因为常见的程序中default 都在最后,这要造成了一些人认为default 在最后。

    MSDN 的说法:

    There can be at most one default statement. The default statement need not come at the end; it can appear anywhere in the body of the switch statement. In fact it is often more efficient if it appears at the beginning of the switch statement. A case or default label can only appear inside a switch statement. 

   最多有一个default 语句在一个switch 中,default 声明不一定在末尾,它可以出现在switch的任何地方那个,实际上如果default出现在switch 的开头会更有效率。

   所以

   int i=2;

   switch(i)

   {

       default :break;

        case 0:

                  printf("0");

                 break;

        case 1:

                 printf("0");

                 break;

        case 2:

               printf(“2”);

              break;

   }    也是合理的。

  

     关于switch()参数值的类型。

  

     参数值类型必须是这几种类型之一:int,long,short ,byte,char.

    switch为什么只能用int,short,byte,char,long,因为switch 只能使用 int 类型或者是可以转换为 int类型的参数(char,char 和 int 通过ascii转换)。

     C语言没有规定一定是int 类型,但是要求是完整的,因此只能是上面几种了。

      关于switch 中case 的个数。

     标准的C编译器至少允许一个switch中最多257个case 标签。这是为了允许switch满足一个字符8位的所有情况,总共是2的8次方256,再加上EOF.

     而Miscrosoft C 编译器的switch中case 是这样定义的。

      MSDN :

     Microsoft C does not limit the number of case values in aswitch statement. The number is limited only by the available memory. ANSI C requires at least 257 case labels be allowed in aswitch statement.

     它不限制case 的个数。 only limited by available memory.

    关于switch 中声明变量初始化的问题。

     int i=2;

     switch(i)

     {

        case 1:

                    break;

        case 2:

                   int sum=5;

                   sum=sum*i;

                   printf("%d",sum);

                  break;

         default:

                 break;

    }

   运行的结果是什么呢。有人可能认为是  10,然而这样写编译器会报错,在VC6,下 为  error C2361: initialization of 'sum' is skipped by 'default' label

  意思是sum变量的初始化被default 跳过 ,没有被初始化。

   来看MSDN 的说明:

   

   Note   Declarations can appear at the head of the compound statement forming theswitch body, but initializations included in the declarations are not performed. Theswitch statement transfers control directly to an executable statement within the body, bypassing the lines that contain initializations.

声明可以出现在switch 块中复合语句的头部(这是C语言的规则,不允许在语句的中间声明变量,C++可以 ,当然在VC6下可以的通过的,因为它是C/C++的混合编译器),但是包含在声明中的初始化不会被执行。

    当写成 int sum;   不报错,运行结果为  -858993460,随机的,因为没有初始化。

    解决的方法为给case 下的语句加上{} 号,便可初始化。

        int i=2;

     switch(i)

     {

        case 1:

                    break;

        case 2:

                 {

                   int sum=5;

                   sum=sum*i;

                  printf("%d",sum);

                  break;

                }

         default:

                 break;

    }

     运行结果为10,已初始化。

   

 

     

      

   

    

C 语言 switch 语句相关推荐

  1. R语言switch语句语法、实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题

    R语言switch语句语法.实战:Switch语句用来处理嵌套的if else处理起来比较困难或者麻烦的条件判断问题 目录

  2. c语言switch语句程序大全,C语言switch语句

    C语言中的switch语句用于从多个条件执行代码. 就像if else-if语句一样. C语言中switch语句的语法如下: switch(expression){ case value1: //co ...

  3. c语言 switch语句大小,C语言switch语句(板式整齐)

    <C语言switch语句(板式整齐)>由会员分享,可在线阅读,更多相关<C语言switch语句(板式整齐)(38页珍藏版)>请在人人文库网上搜索. 1.switch 语句,1, ...

  4. c语言switch()语句

    c语言switch()语句 以上图片来源:https://wenku.baidu.com/view/41e0bb1ef08583d049649b6648d7c1c708a10bb7.html 感谢大牛 ...

  5. c语言switch scanf语句,c语言switch语句 谢谢·!~!~

    c语言switch语句 谢谢·!~!~以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言switch语句 谢谢·!~ ...

  6. C语言 switch语句来调用函数

    C语言 switch语句来调用函数 如果函数写在主函数后面,则在主函数中必须进行函数声明:如果函数写在主函数前面,可适当不写 getchar只能一个一个的读入字符 switch循环语句中最后必须有de ...

  7. c语言switch有什么作用,c语言switch语句如何使用

    C语言的运用非常之多,它兼顾了高级语言的汇编语言的优点,相较于其它编程语言具有较大优势.那么C语言中的switch语句如何使用呢? C语言switch语句如何使用 switch语句允许测试变量与值列表 ...

  8. C语言 switch语句实现不同分数段划分不同等级

    C语言 switch语句实现不同分数段划分不同等级 设定满分为100分,分为20个case,如果分数小于60,则等级为D,在这之前1-10都是与case11相同,可以全部省略.60~70分等级为C,以 ...

  9. C语言switch 语句

    C语言switch 语句 switch 语句 break switch 语句 C语言还提供了另一种用于多分支选择的 switch 语句, 其一般形式为: switch(表达式){case 常量表达式 ...

  10. c语言 switch案例,C语言switch语句实例

    C语言switch语句实例 引导语:switch 语句用于基于不同的条件来执行不同的动作.以下是百分网小编分享给大家的C语言switch语句实例,欢迎阅读学习! C语言还提供了另一种用于多分支选择的s ...

最新文章

  1. mongodb 结果二次调用_mongodb慢查询记录
  2. AIoT重磅报告:四大关键助力,AI+IoT重新定义未来的可能性
  3. linux apt 命令,Ubuntu系统中apt命令的用法汇总
  4. 推荐系统之冷启动问题
  5. 核桃编程:前端可观测性建设之路
  6. 简单com编写流程及注册事项
  7. ansible获取服务器信息,ansible监控服务器资源使用
  8. 使用SecretScanner发现容器镜像和文件系统中的敏感数据
  9. 智能语音翻译APP——腾讯翻译君
  10. 用户输入错误验证码错误三次后,锁定该用户3分钟 redis 使用案列
  11. C 语言还值得学习吗?C 语言会过时吗?C 语言解惑
  12. 页面置换算法之 LRU算法
  13. 2021-6-10-今日收获
  14. while循环和doWhile循环
  15. HTML动画实现唱片封面,HTML5专辑封面创意设计
  16. 全国计算机等级考试三级网络技术
  17. 08 函数基础与参数
  18. ​DMBOK知识梳理for CDGA/CDGP——第六章 数据存储与操作(附常考知识点)
  19. Twitter 宣布抛弃 Mesos,转向 Kubernetes;全球关键5G专利我国占34%;华为面试要改革?...
  20. 移动OA办公系统,开启办公变革新时代

热门文章

  1. Linux != Windows( Linux 不是 Windows)
  2. 【转】悟空,你变成避孕套吧,今天为师要亲自收拾这个女妖精
  3. nacos的命名空间
  4. Linux 性能优化全景指南
  5. 腾讯职场等级(转载自网络)
  6. kettle怎么复制资源库的job_kettle插件更新:定时执行资源库及文件的ktr和kjb作业...
  7. 计算机和运筹学就业方向,运筹学与控制论专业就业方向
  8. Linux系统安装教程(非双系统/虚拟机安装教程)
  9. 全球及中国铁矿石行业供求状况与投资决策建议报告2022版
  10. 2020中央财经大学901c语言大纲,2017年中央财经大学信息学院901C语言程序设计考研导师圈点必考题汇编...