c++ primer中的原话:
把一条声明语句放在与case 或default 相关联的语句中是非法的,除非它被放在一个语句块中,例如,下列代码将导致编译时刻错误
case illegal_definition:
// 错误: 声明语句必须被放在语句块中
string file_name = get_file_name();
// ...
break;
如果一个定义没有被包围在一个语句块中那么它在case 标签之间是可见的,但是只有当定义它的case 标签被执行时它才能被初始化。因此需要一个语句块来保证名字是可见的,并且也只有这个语句块才能够使用它(而且可以保证它只在这个语句块中才能被初始化),为了使我们的程序能通过编译必须引入语句块
xupeng,你的金币还是留着吧,回答问题并不是想要你的金币
song4,不知道我对你说的是不是理解了,按照你的话,是不是编译器分析出如果goto最终没有跳过初始化的话那就是正确的,那么下面的程序:
[CODE]#include <iostream>
using namespace std;
void main()
{
goto RET3;
RET1:
RET2:
int x = 0;
goto RET4;
RET3:
goto RET1;
RET4:
cout<<x<<endl;
}[/CODE]
其中int x=0最终是没有越过的,但是仍然是错误的