objective-c - 在 switch 语句中声明变量

标签 objective-c c variables switch-statement declaration

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

error: expected expression before 'int'

代码:

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

为什么要在没有错误之前调用 NSLog()

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

最佳答案

如果您按照语言的语法进行操作,您实际上可以在开关中声明变量。你得到一个错误是因为 "case 0:"是一个标签,并且在 C 中,将 declaration 作为标签后的第一条语句是非法的 - 请注意编译器需要一个表达式,例如方法调用、正常赋值等。(虽然可能很奇怪,但这就是规则。)

当你把 NSLog() 放在首位时,你就避免了这个限制。您可以将 case 的内容括在 { } 大括号中以引入范围 block ,或者您可以将变量声明移到 switch 之外。您选择哪个是个人喜好问题。请注意,在 { } 大括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内。


编辑:

顺便说一句,这种怪癖并不像您想象的那么罕见。在 C 和 Java 中,将局部变量声明用作 forwhile 中的单独语句(意思是“不被大括号包围)也是非法的do 循环,甚至在 ifelse 子句中。(事实上,这在我强烈推荐的 "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);

还有另一个原因总是使用 { } 大括号来分隔此类构造的主体。 :-)

关于objective-c - 在 switch 语句中声明变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231198/

相关文章:

ios - MapKit iOS rendererForOverlay 刷新失控

iphone - 如何将数组加载到 OpenFlow 中

c - R 和 K、charcount (1.5.2) 未给出正确结果

C:段错误

C - 将函数调用返回值转换为 void

c - 从 uint32_t[16] 数组到 uint32_t 变量序列的 64 位副本

iphone - 奇怪的 NSMutable 数组错误

ios - If 语句在 iOS 中使用 sqlite 语句给出错误

CSS & DIV : Passing parameters with Div classes?

javascript - jQuery var 返回对象