在switch语句中声明变量

时间:2009-08-05 04:31:31

标签: objective-c c variables switch-statement declaration

我看到了这个问题的一些答案,我明白了 - 你不能在switch内声明和分配变量。但我想知道以下是否正确抛出错误说

  

错误:'int'之前的预期表达式

代码:

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

为什么在NSLog()之前调用它会导致没有错误?

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

3 个答案:

答案 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;
}