我看见几个回答这个问题,我得到它-你不能声明并分配变量里面switch
。 但我想,如果下面是抛出一个错误说法正确
错误:“INT”之前预期表达
码:
switch (i) {
case 0:
int j = 1;
break;
}
为什么会投入到呼叫NSLog()
之前它导致没有错误?
switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}
实际上,你可以 ,如果你根据语言的语法做一个交换机内声明的变量。 你得到一个错误,因为“ case 0:
”是一个标签,并在C中,它是非法的声明作为标签后的第一条语句-注意,编译器期望的表达 ,如方法调用,正常分配,等(奇异尽管它可能是,这就是规则。)
当你把的NSLog()首先,你避免了这种限制。 您可以括在{}的情况下的内容牙套引入作用域块,也可以将开关之外将变量声明。 你的选择是个人喜好的问题。 要知道,在声明的变量{}括号仅仅是范围内有效,所以使用它也必须出现的括号内的任何其他代码。
编辑:
顺便说一句,这个怪癖并不像你想象的那么罕见。 在C和Java,这也是非法使用本地变量声明为唯一的语句(意为“不被括号括起来)在为 , 同时 ,或做循环,甚至如果和其他条款。(事实上,这是覆盖益智游戏#55 “的Java谜题” ,我强烈建议)。我认为,我们一般不写这样的错误开始,因为这是毫无意义的变量声明为在这样的背景下的语句。带开关 /结构的情况下 ,虽然,有些人省略大括号,因为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);
另一个原因始终使用{}括号来界定这种结构的主体。 :-)
我以前也碰到这个问题,结论是,你只是把代码块中。
switch (i) {
case 0:
{
int j = 1;
break;
}
}
另一个简单的解决方法我使用是声明之前添加一个空表达式(分号)。 这避免了限制变量范围的码块(或与代码块和一些没有一些情况下语句)。
switch (i) {
case 0:;
int j = 1;
break;
}