关于objective c:在switch语句中声明变量

Declaring variables inside a switch statement

本问题已经有最佳答案,请猛点这里访问。

我看到了这个问题的一些答案,我明白了——你不能在switch中声明和分配变量。但我想知道下面这句话是否正确

error: expected expression before 'int'

代码:

1
2
3
4
5
switch (i) {
    case 0:
        int j = 1;
        break;
}

为什么在没有错误之前打电话给NSLog()

1
2
3
4
5
6
switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}


实际上,如果您根据语言的语法来声明开关中的变量,那么就可以在开关中声明变量。您会得到一个错误,因为"case 0:是一个标签,而在c中,将声明作为标签后的第一个语句是非法的-请注意,编译器需要一个表达式,如方法调用、正常赋值等(这可能很奇怪,但这是规则)。

当您将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;
}