3 回答
TA贡献1887条经验 获得超5个赞
如果您根据语言的语法进行操作,则实际上可以在开关中声明变量。由于出现错误,因为“ case 0:”是标签,在C语言中,在标签后的第一个语句中声明为非法是非法的-请注意,编译器需要表达式,例如方法调用,常规赋值等。(尽管可能很奇怪,但这是规则。)
当您首先放置NSLog()时,避免了此限制。您可以将案例的内容括在{}中以引入作用域,也可以将变量声明移到开关之外。您选择哪种取决于个人喜好。请注意,用{}括号声明的变量仅在该范围内有效,因此使用该变量的任何其他代码也必须出现在这些括号内。
编辑:
顺便说一下,这种怪异并不像您想象的那样普遍。在C和Java中,在for,while或do循环甚至if和else子句中使用局部变量声明作为lone语句(意思是“不用大括号括起来”)也是非法的(实际上,这是覆盖益智游戏#55 “的Java谜题”,我强烈建议)。我认为,我们一般不写这样的错误开始,因为这是毫无意义的变量声明为在这样的背景下的语句。随着开关 / 但是,案例构造有些人在休息后就省略了花括号 语句是控制流的关键语句。
要查看编译器是否符合要求,请将以下可怕的,毫无意义的代码段复制到您的(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);
始终使用{}大括号分隔此类构造体的另一个原因。:-)
TA贡献1911条经验 获得超7个赞
我使用的另一个简单的解决方法是在声明之前添加一个空表达式(分号)。这避免了将变量范围限制为代码块(或某些case语句带有代码块,而有些case语句没有代码块)。
switch (i) {
case 0:;
int j = 1;
break;
}
- 3 回答
- 0 关注
- 729 浏览
添加回答
举报