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支持在switch下case上定义,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分支(