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

我看到了这个问题的一些答案,我明白了——你不能在 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);

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

https://stackoverflow.com/questions/1231198/

相关文章:

objective-c - 使用 -performSelector : vs. 只是调用方法

ios - UIRefreshControl - 当 UITableViewController 在

objective-c - 如何使用 Objective-C 解析 JSON?

ios - UILabel 中的动画文本更改

ios - 什么时候使用 NSSet 而不是 NSArray 更好?

iphone - ARC 还是不 ARC?有什么优点和缺点?

iphone - 导航栏出现在带有新 iOS7 SDK 的 View 上

ios - 如何从 NSDate 获取小时和分钟?

objective-c - 如何向 NSDictionary 添加 bool 值?

objective-c - NSObject +load 和 +initialize - 他们做什么