diz*_*izy 114 c variables declaration objective-c switch-statement
我看到了这个问题的一些答案,我明白了 - 你不能在一个内部声明和分配变量switch.但我想知道以下是否正确抛出错误说
错误:'int'之前的预期表达式
码:
switch (i) {
case 0:
int j = 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
为什么NSLog()在它之前拨打电话会导致没有错误?
switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}
Run Code Online (Sandbox Code Playgroud)
Qui*_*lor 140
实际上,如果根据语言的语法执行变量,则可以在开关中声明变量.你得到一个错误,因为" case 0:"是一个标签,而在C中,将一个声明作为标签之后的第一个语句是非法的- 请注意编译器需要一个表达式,例如方法调用,正常赋值等.虽然可能是奇怪的,但这是规则.)
当您首先放置NSLog()时,您避免了此限制.您可以在{}括号中包含案例的内容以引入作用域块,或者您可以将变量声明移到开关外部.你选择哪个是个人喜好的问题.请注意,{}括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内.
编辑:
顺便说一句,这个怪癖并不像你想象的那么罕见.在C和Java中,在for,while或do循环中,甚至在if和else子句中使用局部变量声明作为单独的语句(意思是"没有括号括起来")也是非法的.(事实上,这是覆盖益智游戏#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);
Run Code Online (Sandbox Code Playgroud)
另一个原因是总是使用{}大括号来划分这些结构的主体.:-)
new*_*cct 46
我之前遇到过这个问题,结论是你只是将代码放在一个块中.
switch (i) {
case 0:
{
int j = 1;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
29392 次 |
| 最近记录: |