在switch语句中声明变量

diz*_*izy 114 c variables declaration objective-c switch-statement

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

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

码:

switch (i) {
    case 0:
        int j = 1;
        break;
}
Run Code Online (Sandbox Code Playgroud)

为什么NSLog()在它之前拨打电话会导致没有错误?

switch (i) {
    case 0:
        NSLog(@"wtf");
        int j = 1;
        break;
}
Run Code Online (Sandbox Code Playgroud)

Qui*_*lor 140

实际上,如果根据语言的语法执行变量,则可以在开关中声明变量.你得到一个错误,因为" case 0:"是一个标签,而在C中,将一个声明作为标签之后的第一个语句是非法的- 请注意编译器需要一个表达式,例如方法调用,正常赋值等.虽然可能是奇怪的,但这是规则.)

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


编辑:

顺便说一句,这个怪癖并不像你想象的那么罕见.在C和Java中,在for,whiledo循环中,甚至在ifelse子句中使用局部变量声明作为单独的语句(意思是"没有括号括起来")也是非法的.(事实上,这是覆盖益智游戏#55 "的Java谜题",我强烈建议).我认为,我们一般不写这样的错误开始,因为这是毫无意义的变量声明为在这样的背景下的语句.随着开关/情况下构建,但是,有些人省略大括号,因为休息语句是控制流的关键语句.

要查看编​​译器抛出拟合,请将这个可怕的,无意义的片段复制到您的(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);
Run Code Online (Sandbox Code Playgroud)

另一个原因是总是使用{}大括号来划分这些结构的主体.:-)

  • 通常,如果变量仅在单个案例中使用,那么将{}中的案例部分封闭将是更好的形式(它避免了以后意外重用).如果变量再次使用,那么在switch语句开始之前声明它确实更有意义,因为它非常钝. (9认同)
  • 不奇怪.C#的错误实际上比gcc错误更清晰,这很好.实际上,我不确定我是否将其归类为"问题"...更多是故意禁止的语法.我猜大多数基于C语言的行为都类似. (3认同)

new*_*cct 46

我之前遇到过这个问题,结论是你只是将代码放在一个块中.

switch (i) {
case 0:
    {
        int j = 1;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)