关于switch...case...语句(Compiler Error C2360)

来源:互联网 发布:天津网络花店 编辑:程序博客网 时间:2024/06/06 02:03

 

 一般的书上或者网上面的关于switch...case...的介绍都比较笼统,也比较简单,总给我感觉用处不大,而且用法又有限制。但是用的时候发现还是有些小问题的。

 

用处:个人比较喜欢把switch...case...用到菜单的选择里面。用一个char型的变量flag来接收选择。

 

总结:大多数书上的例子都是一些一些算数表达式,然后case里面接的也就是一句printf或者cout,给人的感觉很弱智。后来才发现能够接多条语句。而且根据一些说明,是不用加括号的。也就是说一个case后面的语句不论是一条语句还是复合语句还是多条语句,break之前都不用加括号。

 

一开始我试的时候的确能用,但是我用C++编程序的时候写的for循环里面的循环变量总是出错。也就是for(int i=0; ... ; ...)总是报错。Compiler Error C2360. initialization of 'identifier' is skipped by 'case' label

即定义的被case语句跳过,当初碰到这个问题的时候时间比较紧,就把循环变量放到了switch外面去定义了。能暂时解决问题,但是总感觉不好。今天又碰到这个问题,又有时间就查了下,有人说是定义不能在switch里面。

 

先给出例子:

switch(x)   
  {   
  case   1:   
  {   
           int   a   =   x;         //这里加了大括号,pass   
           break;   
  }   
    
  case   2:   
  {   
          int   b   =   x;         //这里没加大括号,failed,不过把case   3去掉也success   
          break;   
  }   
  case   3:   
  break;                     
  }   

 

也就是说正常情况下能够不加大括号。然而定义变量就会被报Compiler Error C2360

的错误。加了大括号之后,变量在里面就能够正常编译。

一些网友给出的解释是:一般来说,不要把变量的定义放在case中,特别是后面要用到的变量。如果switch中没有执行到这个case分支,这个变量就会没有定义。C2360是编译器对这类错误给出的提示。   

    
  在{}中的变量的定义因为其scope只限在{}中,所以不存在上述问题。

 

具体原因待续....