声明变量内部的一个关声明[重复]
-
22-07-2019 - |
题
这个问题已经有一个答案在这里:
- 为什么不能变量宣布,在一个开声明? 23的答案
我看到了一些答案这一问题,我得到它—你不能宣布和分配变量内部的一个 switch
.但我想知道,如果下面是正在投掷一个错误说
错误:预期表达之前,'int'
代码:
switch (i) {
case 0:
int j = 1;
break;
}
为什么要把一个电话来 NSLog()
之前,它导致没有错误?
switch (i) {
case 0:
NSLog(@"wtf");
int j = 1;
break;
}
解决方案
实际上你 可以 声明内的变量开关如果你这样做是根据本法的语言。你得到错误的,因为"case 0:
"是一个标签,并在C它是非法的有一个 宣言 作为第一发言后的一个标签的注意,预计编译器 表达, 如呼叫的方法,正常分配,等等。(奇怪的,虽然它可以,这就是规则。)
当你把只()首先,你避免这种限制。你可以附上内容的情况下在{}括号引入一个范围界定块,或者可移动的变量声明以外的开关。你选择的是一个人偏好的问题。只是知道这个变声明的{}括号只有在这一范围,所以任何其他代码使用它还必须出现在这些括号。
编辑:
顺便说一句,这个怪癖是不是不常见,因为你可能会认为。在C和爪哇,这也是非法使用本地可变的宣言》作为唯一的发言(意"不包围的括号)中的一个 对于, 同时, 或 做 循环,或者甚至在 如果 和 别 条款。(事实上,这是复盖擦亮#55 "Java困惑", 我强烈推荐。) 我认为,我们一般不要写这样的错误的开始,因为它是毫无意义的声明变为唯一的发言在这种情况。与 开关 / 情况下 结构,虽然,一些人忽略的牙套因为 打破 发言是关键性声明的控制流程。
看到编译器扔适合,复制这种可怕的、毫无意义的片段变成你的(目标)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;
}