这个问题已经有一个答案在这里:

我看到了一些答案这一问题,我得到它—你不能宣布和分配变量内部的一个 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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top