3 回答
TA贡献1802条经验 获得超6个赞
Caseswitchcase
switch (val){ case VAL: {
// This will work
int newVal = 42;
break;}case ANOTHER_VAL: ...break;}TA贡献1828条经验 获得超6个赞
在C+中,此代码无效,因为 case ANOTHER_VAL:标签跳入变量的范围。 newVal绕过它的初始化。跳过本地对象的初始化在C+中是非法的。大多数答案都正确地处理了这个问题的这一面。 但是,在C语言中,绕过变量初始化并不是一个错误。在初始化时跳入变量的范围在C中是合法的。它只是意味着变量没有初始化。由于完全不同的原因,原始代码没有在C中编译。标签 case VAL:在原始代码中,变量的声明附加在一起。 newVal..在C语言中,声明不是语句。他们不能被贴上标签。当这段代码被解释为C代码时,这就是导致错误的原因。 switch (val) { case VAL: /* <- C error is here */ int newVal = 42; break;case ANOTHER_VAL: /* <- C++ error is here */ ... break;}
{}newValcase ANOTHER_VAL:{}case VAL:
在C情况下,这个问题可以很容易地解决,而不需要 {}..之后添加一个空语句即可。 case VAL:标签和代码将变得有效。 switch (val) { case VAL:; /* Now it works in C! */ int newVal = 42; break;case ANOTHER_VAL: ... break;}注意,尽管从C的角度来看,它现在是有效的,但从C+的角度来看,它仍然是无效的。 对称地说,在C+情况下,这个问题可以很容易地解决,而不需要 {}..只要从变量声明中删除初始化程序,代码就会生效。 switch (val) { case VAL: int newVal; newVal = 42; break;case ANOTHER_VAL: /* Now it works in C++! */ ... break;}注意,尽管从C+的角度来看,它现在是有效的,但从C的角度来看,它仍然是无效的。
TA贡献1786条经验 获得超11个赞
switch (i){
case 0:
int j; // 'j' has indeterminate value
j = 0; // 'j' initialized to 0, but this statement
// is jumped when 'i == 1'
break;
case 1:
++j; // 'j' is in scope here - but it has an indeterminate value
break;}class A {public:
A ();};switch (i) // Error - jumping over initialization of 'A'{
case 0:
A j; // Compiler implicitly calls default constructor
break;
case 1:
break;}goto LABEL; // Error jumping over initializationint j = 0; LABEL: ;
- 3 回答
- 0 关注
- 836 浏览
添加回答
举报
