如果您根据语言的语法进行操作,您实际上可以在 switch 中声明变量。你会得到一个错误,因为 " case 0:
" 是一个标签,在 C 中,将声明作为标签后的第一条语句是非法的 - 请注意,编译器需要一个表达式,例如方法调用、正常赋值等。(虽然可能很奇怪,但这就是规则。)
当你把 NSLog() 放在首位时,你就避免了这个限制。您可以将 case 的内容括在 { } 大括号中以引入范围块,或者您可以将变量声明移到 switch 之外。您选择哪个是个人喜好问题。请注意,在 { } 大括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内。
编辑:
顺便说一句,这个怪癖并不像你想象的那么罕见。在 C 和 Java 中,将局部变量声明用作for、while或do循环,甚至if和else子句中的单独语句(意思是“不被大括号包围)也是非法的。(事实上,这是包含在“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);
总是使用 { } 大括号来分隔此类构造的主体的另一个原因。:-)