【问题标题】:switch statement in C / Objective CC / Objective C中的switch语句
【发布时间】:2015-01-08 05:23:09
【问题描述】:

我是 Objective-C 的新手,但是从我对 switch 语句的了解来看,下面的代码不应该打印任何东西,因为在我看来应该有编译错误。但是 2 被打印出来。我不理解为什么。有人可以解释一下吗?

- (void) test {
    int myVar = 2;

    switch (myVar) {
        case 1:
        {
            NSLog(@"result: %d", myVar);
            break;

            case 2:
            {
                NSLog(@"result: %d", myVar);
            }
            break;
        }
    }
}

【问题讨论】:

  • a case: 不是块或独立语句。这是一个标签。将其视为条件goto 的目标。
  • 不知道为什么投反对票。这是有趣的 C 语言的一个非常微妙的细节。这是因为它是有效代码还是语法巧合而编译?另外,去查找“达夫的设备”。
  • @bbum 它是有效的,正是因为cases 是标签。还有,达夫的设备。
  • 如果必须在case: 的主体中声明变量,则必须使用方括号。这就是我遇到这个问题的方式。我的例子被剥离到核心。
  • 值得注意的是,这不是 Objective-C 的行为。这也表现如 C 中所示。 gist.github.com/wjlafrance/ce7581374a47ed65bf44

标签: objective-c c switch-statement


【解决方案1】:

您可以将switch(value){case label:, ...} 构造视为一个变量 goto <label> 语句,其中:

1)switch(arg) 确定接下来将执行哪个 label
2) 关键字 case : 定义了 label。示例:case label:

在 switch 语句中,case 关键字后跟标签(常量表达式后跟 :),其处理方式与 goto 语句中使用的标签相同。控制传递给case constant-expression 与语句switch(arg)arg 的值匹配的语句。

所以从法律上讲,您的代码语法没有任何问题。也就是说,它将编译和构建,并且运行良好。您的示例代码中的语法唯一违反的是可读性,因为执行流程忽略了块{...},在大多数情况下会直接执行流程,并直接跳转到由case 关键字,正如它应该的那样。

忽略成熟的先例来试验新的混合结构通常不会产生有用的结果。但是,当它发生时,结果可能会变得传奇。例如,see Duff's Device

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2019-03-02
    • 2016-05-10
    • 2015-11-05
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多