我看到了这个问题的一些答案,我明白了 - 你不能在switch
内声明和分配变量。但我想知道以下是否正确抛出错误说
错误:'int'之前的预期表达式
代码:
switch (i) {
case 0:
int j = 1;
break;
}
为什么在NSLog()
之前调用它会导致没有错误?
switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}
答案 0 :(得分:138)
如果您根据语言的语法执行此操作,实际上可以在交换机中声明变量。您收到错误是因为“case 0:
”是一个标签,而在C中,将声明作为标签后的第一个语句是违法的 - 请注意编译器需要表达式,例如方法调用,正常分配等。(虽然可能是奇怪的,但这是规则。)
当您首先放置NSLog()时,您避免了此限制。您可以在{}括号中包含案例的内容以引入作用域块,或者您可以将变量声明移到开关外部。你选择哪个是个人喜好的问题。请注意,{}括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内。
修改强>
顺便说一句,这个怪癖并不像你想象的那么罕见。在C和Java中,使用局部变量声明作为单独的语句(意思是“未被大括号括起来”,用于,用于或)也是非法的。执行循环,甚至在 if 和 else 子句中。(事实上,"Java Puzzlers"的益智游戏#55涵盖了这一点。推荐。)我认为我们通常不会在开始时编写这样的错误,因为在这种情况下将变量声明为唯一的语句是没有意义的。使用 switch / case break 语句是控制流的关键语句。
要查看编译器抛出拟合,请将这个可怕的,无意义的片段复制到您的(Objective-)C代码中:
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 :(得分:46)
之前我遇到过这个问题,结论是你只是把代码放在一个块中。
switch (i) {
case 0:
{
int j = 1;
break;
}
}
答案 2 :(得分:3)
我使用的另一个简单的解决方法是在声明之前添加一个空表达式(分号)。这避免了将变量范围限制为代码块(或者有一些带有代码块的case语句而有些没有)。
switch (i) {
case 0:;
int j = 1;
break;
}