|
发表于 2006-5-22 10:45:39
|
显示全部楼层
这个现象挺奇怪。在c语言中根本就不允许在函数中间声明任何变量。
所以这个应该是C++的规则:It is illegal to jump past a declaration with an initializer unless the declaration is enclosed in a block.
一个声明并初始化变量的语句, 在该语句所在的语法范围内,该语句必须被执行,否则编译器就报错。
不过奇怪的是被break掉的语句虽然也有可能永远不被执行,但编译器好像管不了。
例如:
void main(int argc, char* argv[])
{
goto lab1:
int i = 1;
lab1:
}
上面的语句int i = 1;不会被执行, 编译就出错。 把int i = 1; 改为int i ;就能编译通过但有警告。或者这样
void main(int argc, char* argv[])
{
goto lab1:
{
int i = 1;
}
lab1:
}
也能通过,因为在int i = 1;所在的范围内这条语句肯定被执行了.
但
void main(int argc, char* argv[])
{
goto lab1:
{
goto lab2;
int i = 1;
lab2:
}
lab1:
}
这样又不能通过,因为在int i = 1;所在的范围内这条语句没被执行.
void main(int argc, char* argv[])
{
while(1)
{
int m =1;
m ++;
break;
int n = 2;
n++;
}
}
上面的int n = 2;
虽然永远不能执行,但它是被break掉的,所以编译器可以编译通过,编译器好像没看见break一样。
一个switch语句是一个语法范围,因为有一个{} ,所有的case在同一个范围内。
一个switch语句除了最后一个case肯定被执行外(去掉所有的break),其它的case都有可能不被执行(就算去掉所有的break也不行,都其实是被goto掉的),所以不能声明初始化变量语句。除非放在{}中。 |
|