C/Objective C中的switch语句

Raz*_*zor 13 c objective-c switch-statement

我是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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ryy*_*ker 13

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

1) switch(arg)确定哪个label执行将流向下一个.
2) 关键字案例:定义标签.示例: case label:.

在switch语句中,case关键字后跟一个标签(常量表达式后跟a :),它被视为goto语句中使用的标签.控制传递给与语句中case constant-expressionarg值匹配的语句switch(arg).

从法律上讲,你的代码在语法上没有任何错误.也就是说,它将编译和构建,并运行得很好.示例代码中的语法唯一违反的是可读性,因为执行流程忽略了块{...},在大多数情况下会阻止执行流程,并直接跳转到case关键字定义的目标标签,就像它应该的那样.

通常不会忽视用于试验新的杂合构建体的良好先例将产生有用的结果.但是当它发生时,结果可能会成为传奇.例如,请参阅Duff的设备.