在switch语句中声明variables

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

错误:在'int'之前的期望expression式

码:

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

为什么会在不导致错误之前调用NSLog()呢?

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

实际上,如果根据语言的语法进行操作,则可以在交换机中声明variables。 你遇到一个错误,因为“ case 0: ”是一个标签,在C中, 声明是第一条语句是非法的 – 注意编译器需要一个expression式 ,比如方法调用,正常赋值,等等(虽然可能是奇怪,但这是规则。)

当你把NSLog()第一次,你避免了这个限制。 您可以将一个案例的内容放在{}括号中,以引入一个范围区块,或者您可以将variables声明移到开关外部。 你select哪一个是个人喜好的问题。 请注意,在{}括号中声明的variables只在该范围内有效,所以使用它的任何其他代码也必须出现在这些大括号内。


编辑:

顺便说一句,这个怪癖并不像你想像的那么less见。 在C和Java中,在forwhiledo循环中,甚至在ifelse子句中使用局部variables声明作为孤立语句(意思是“不用大括号包围”)也是非法的(事实上,这是在“Java Puzzlers”的困惑者55中,我强烈推荐)。我认为我们一般不会写这样的错误开始,因为在这样的上下文中声明一个variables是唯一的语句是没有意义的,但是有些人省略了大括号,因为break语句是控制stream的关键语句。

为了看看编译器是否适合,将这个可怕的,毫无意义的代码片段复制到你的(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; } } 

我使用的另一个简单的解决方法是在声明之前添加一个空的expression式(分号)。 这样可以避免将variables范围限制在一个代码块(或者包含一些带有代码块的情况语句,有些则没有)。

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