3 回答
TA贡献1802条经验 获得超6个赞
Case
switch
case
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;}
{}
newVal
case 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 关注
- 787 浏览
添加回答
举报