Declaring variables inside a switch statement
我看到了这个问题的一些答案,我明白了——你不能在
error: expected expression before 'int'
代码:
1 2 3 4 5 | switch (i) { case 0: int j = 1; break; } |
为什么在没有错误之前打电话给
1 2 3 4 5 6 | switch (i) { case 0: NSLog(@"wtf"); int j = 1; break; } |
实际上,如果您根据语言的语法来声明开关中的变量,那么就可以在开关中声明变量。您会得到一个错误,因为"
当您将nslog()放在第一位时,就避免了这种限制。您可以将案例的内容括在大括号中以引入范围块,也可以将变量声明移出开关。你选择的是个人喜好。请注意,大括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内。
编辑:
顺便说一句,这种怪癖并不像你想象的那样罕见。在C和Java中,使用局部变量声明作为LoOne语句(意思是"不被括号包围")在AF、WORD或DO循环中,甚至在IF和EFER子句中也是非法的。(事实上,这在"Java困惑器"的困惑器55中涉及,我强烈推荐。)我认为我们通常不首先写这样的错误,因为声明变量是这种上下文中的唯一语句是没有意义的。但是,对于switch/case结构,有些人省略了大括号,因为break语句是控制流的关键语句。
要查看编译器的适用性,请将这个可怕的、毫无意义的代码片段复制到(目标-)C代码中:
1 2 3 4 5 6 7 8 9 10 11 | if (1) int i; else int i; for (int answer = 1; answer <= 42; answer ++) int i; while (1) int i; do int i; while (1); |
还有一个总是使用大括号来界定此类构造体的原因。-)
我以前遇到过这个问题,结论是您只是将代码放在一个块中。
1 2 3 4 5 6 7 | switch (i) { case 0: { int j = 1; break; } } |
我使用的另一个简单的解决方法是在声明之前添加一个空表达式(分号)。这避免了将变量范围限制为代码块(或具有一些带代码块的case语句和一些不带代码块的case语句)。
1 2 3 4 5 | switch (i) { case 0:; int j = 1; break; } |