C++新手一枚,近几日编写代码时,有如下错误,是关于C/C++中switch语句case中变量不能初始化赋值的问题。代码如下:

<pre name="code" class="cpp">#include <iostream>
using namespace std;
int main()
   char op;
   cin>>op;
   switch(op)
    case '0':
     int a=3;
     break;
    default:
     break;
   return 0;
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">编译器会提示如下错误</span>

 error C2361:"default"标签跳过'op'd的初始化操作

可是如果将第10行代码int a=3;改为int a;  a=3;

编译器就不再提示错误。

这是为了防止下面这种错误

<pre code_snippet_id="495309" snippet_file_name="blog_20141024_1_2605774" class="cpp" name="code"><pre name="code" class="cpp">#include <iostream>
#include <iomainp>
using namespace std;
int main()
   int op;
   cin>>op;
   switch(op)
      case '1':
          int a;
          break;
      case '2':
          break;
      default:
          break;
    return 0;
 在 上述代码中如果在case‘0’中进行了变量a的声明,而在case'2'中进行了使用,这会发生作用域错误。 

而c++规定不能跳过变量初始化语句直接跳到变量的作用域内

这个错误属于语法问题,应加以记忆。解决方案有两种

1.case中如有变量初始化,一定要加{}
为什么?
加上{}就是新的作用域了,C89,ANSI C只能在新的作用域开始处定义变量

2.可把初始化放在switch之前
注意:int类型和用户自定义类型,实质都是一样的。都属于数据类型,只不过一个是简单数据类型,一个是复合数据类型

#includeint main(){ int i=1; switch(i) { case 1: int a=1; printf("%d/n",a); break; case 2: printf("不可能的结果"); break; default:break; } return 0;} 编译出现[Error] D:/文 VS +qt C++ 编写case语句出现初始化操作由”case“标签跳过问题 最近在编写代码时用到switch语句时出现“line1”的初始化操作由“case”标签跳过问题switch (type) case 1: xRegLine* line1 = static_cast<xRegLine*>(entities[ 总结就是,最好不要在switch下定义变量(c支持在switchcase上定义,c++不支持),如果非要定义,需要加。最好的办法,还是定义在switch上。 在Qt5.9.6编写switch{ case}语句,先在case 0定义变量,然后在后面的语句使用,编译就会报错: jump to case label [-fpermissive] 原因就是C++约定,在switch语句,对象的作用域从对象的声明语句开始直到块语句的结束,也就是说default标号后的语句是可以使用之前case定义的变量的。 如果程序执行时从switch处跳到... 在switch语句初始化变量的话记得一定要将此case语句加{。。。}!! 变量初始化可能被switch语句。除非把变量定义放在一个程序块面,否则不能跳过带有初始化变量定义。(除非定义在一个程序块变量作用域直到switch语句结束) switch-case: ①.switch语句变量仅允许byte,short,char,int,enum(枚举JDK1.5及以后版本允许),String(字符串JDK1.7及以后版本允许)。 ②.case语句的值必须与switch的值类型相同(不存在隐式类型转换),且其值必须为常量或者字面量。 ③.当switch值与case值相等时,开始执行case之后的语句直到遇见break语句或者return语句执行switch末尾才会跳出switch语句。 ④.switch语句可以包含一个default分支(