我编写了一个涉及使用 switch 语句的程序,但是在编译时它显示:
错误:跳转到案例标签。
为什么这样做?
#include <iostream> int main() { int choice; std::cin >> choice; switch(choice) { case 1: int i=0; break; case 2: // error here } }
问题是,在其中声明的变量在case后续的 s 中仍然可见,case除非使用显式{聽}块, 但它们不会被初始化 ,因为初始化代码属于另一个s case。
case
{聽}
在下面的代码中,如果foo等于 1,一切正常,但如果等于 2,我们会不小心使用i确实存在但可能包含垃圾的变量。
foo
i
switch(foo) { case 1: int i = 42; // i exists all the way to the end of the switch dostuff(i); break; case 2: dostuff(i*2); // i is *also* in scope here, but is not initialized! }
将案例包装在显式块中可以解决问题:
switch(foo) { case 1: { int i = 42; // i only exists within the {聽} dostuff(i); break; } case 2: dostuff(123); // Now you cannot use i accidentally }
更详细地说,switch语句只是一种特别花哨的 a goto。这是一段类似的代码,展示了相同的问题,但使用 agoto而不是 a switch:
switch
goto
int main() { if(rand() % 2) // Toss a coin goto end; int i = 42; end: // We either skipped the declaration of i or not, // but either way the variable i exists here, because // variable scopes are resolved at compile time. // Whether the *initialization* code was run, though, // depends on whether rand returned 0 or 1. std::cout << i; }