声明在switch语句中的变量[复制](Declaring variables inside a s

2019-06-18 01:33发布

这个问题已经在这里有一个答案:

  • 为什么不能变量switch语句声明? 23个回答

我看见几个回答这个问题,我得到它-你不能声明并分配变量里面switch 。 但我想,如果下面是抛出一个错误说法正确

错误:“INT”之前预期表达

码:

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

为什么会投入到呼叫NSLog()之前它导致没有错误?

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

Answer 1:

实际上,你可以 ,如果你根据语言的语法做一个交换机内声明的变量。 你得到一个错误,因为“ case 0: ”是一个标签,并在C中,它是非法的声明作为标签后的第一条语句-注意,编译器期望的表达 ,如方法调用,正常分配,等(奇异尽管它可能是,这就是规则。)

当你把的NSLog()首先,你避免了这种限制。 您可以括在{}的情况下的内容牙套引入作用域块,也可以将开关之外将变量声明。 你的选择是个人喜好的问题。 要知道,在声明的变量{}括号仅仅是范围内有效,所以使用它也必须出现的括号内的任何其他代码。


编辑:

顺便说一句,这个怪癖并不像你想象的那么罕见。 在C和Java,这也是非法使用本地变量声明为唯一的语句(意为“不被括号括起来)在同时 ,或循环,甚至如果其他条款。(事实上,这是覆盖益智游戏#55 “的Java谜题” ,我强烈建议)。我认为,我们一般不写这样的错误开始,因为这是毫无意义的变量声明为在这样的背景下的语句。带开关 /结构的情况下 ,虽然,有些人省略大括号,因为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);

另一个原因始终使用{}括号来界定这种结构的主体。 :-)



Answer 2:

我以前也碰到这个问题,结论是,你只是把代码块中。

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


Answer 3:

另一个简单的解决方法我使用是声明之前添加一个空表达式(分号)。 这避免了限制变量范围的码块(或与代码块和一些没有一些情况下语句)。

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


文章来源: Declaring variables inside a switch statement [duplicate]