我是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;
}
}
}
答案 0 :(得分:13)
您可以将switch(value){case label:, ...}
构造视为变量 goto <label>
语句,其中:
1) switch(arg)
确定哪个label
执行将流向下一个。
2) 关键字 案例: 定义 标签 。示例:case label:
。
在switch语句中,case
关键字后跟一个标签(常量表达式后跟:
),它被视为goto
语句中使用的标签。控制传递到case constant-expression
与语句switch(arg)
中的 arg 的值匹配的语句。
合法地说,你的代码没有语法错误。也就是说,它将编译和构建,并运行得很好。示例代码中的语法唯一违反的是可读性,因为执行流程忽略了块{...}
,在大多数情况下会阻止执行流程,并直接跳转到定义的目标标签通过case
关键词,就像它应该的那样。
通常不会忽视用于试验新杂交构建体的良好先例将产生有用的结果。但是当它发生时,结果可能会成为传奇。例如, see Duff's Device 。