在 switch 语句中声明变量

我看到了一些关于这个问题的答案,我明白了ーー你不能在 switch中声明和赋值变量。但是我想知道下面的错误是否正确

Error: “ int”之前的预期表达式

密码:

switch (i) {
case 0:
int j = 1;
break;
}

为什么在没有错误之前调用 NSLog()

switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}
31415 次浏览

实际上,如果您根据语言的语法在开关中声明变量,则 可以会在开关中声明变量。你会得到一个错误,因为“ case 0:”是一个标签,在 C 语言中,将 声明作为标签后面的第一个语句是非法的ーー注意,编译器期望的是 表情,比如方法调用、正常赋值等(尽管这可能很奇怪,但这是规则)

当您将 NSLog ()放在第一位时,您避免了这种限制。您可以将大小写的内容放在{}括号中以引入范围块,或者可以将变量声明移到开关外部。你的选择是个人喜好的问题。请注意,在{}大括号中声明的变量仅在该范围内有效,因此使用该变量的任何其他代码也必须出现在这些大括号中。


编辑:

顺便说一句,这种怪癖并不像你想象的那么罕见。在 C 和 Java 中,在 为了同时循环中,甚至在 如果别的子句中,使用局部变量声明作为孤立语句(意思是“没有被大括号包围”)也是非法的。(事实上,我强烈推荐 “ Java 智力游戏”的第55号谜题就包含了这一点。)我认为我们一般不会首先写这样的错误,因为在这样的上下文中将变量声明为唯一的语句是没有意义的。但是,对于 开关/案件构造,有些人忽略了大括号,因为 休息语句是控制流的关键语句。

要查看编译器的匹配情况,请将这个可怕的、毫无意义的代码片段复制到您的(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);

还有一个原因是总是使用{}大括号来分隔这种结构的主体。 : -)

我以前遇到过这个问题,结论是你只需要把代码放在一个块中。

switch (i) {
case 0:
{
int j = 1;
break;
}
}

Another simple workaround I use is to add an empty expression (semicolon) before the declaration. This avoids limiting the variable scope to a code block (or having some case statements with code blocks and some without).

switch (i) {
case 0:;
int j = 1;
break;
}