关于goto的一个疑问

ayanamiwww 2005-03-11 10:02:37
代码:

goto SECTION;

int a = 10;
.
.
.
SECTION:
//other code
.
.

这段代码编译的时候,就会报错,意思是 int a 的初始化被goto越过等等的意思。

--------------------------------------------------------
但是改成这样就没有问题
goto SECTION;

{
int a = 10;
.
.
.
}
SECTION:
//other code
.
.

代码都是一样的,加了一个括号就不会报错,请问为什么呢?
...全文
153 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
poooorgun 2005-03-23
  • 打赏
  • 举报
回复
作用域问题,{}内定义的变量只在其内有效
StarsWu 2005-03-23
  • 打赏
  • 举报
回复
去看一下变量的作用域吧,在switch中是不能直接定义变量的,加了{}后就变成了{}内的局部变量了。
cut9 2005-03-23
  • 打赏
  • 举报
回复
编译器在编译的时候,要知道为变量分配的栈空间(不是堆空间,堆空间编译器不知道).
比如:
栈分配:char a[10]. 可以
x= 5; char b[x]; 不可以.编译器不知道x是5(还没运行呢!),不知道分配多少。

变量的栈空间都是在编译的时候分配的。

回到你的问题:

go to _selection;
int a = 10;
....
_selection:
....
编译器编译的时候,到了 go to _selection,它不知道该不该分配了。程序运行到这儿,跳转到
_selection, 如果分配了,释放是个问题。如果不分配,你又申明了这个变量。也就是说,这带来
一个模糊性。编译器不能解决。
switch的例子一样。

go to _selection;
{
int a = 10;
....
}
_selection:
....
加上 {},编译器知道在{} 里头分配和释放,模糊性解决。PASS.















ayanamiwww 2005-03-12
  • 打赏
  • 举报
回复
谢谢你们的回复,大概明白,最好能讲得更深入一点。
iamwiner 2005-03-11
  • 打赏
  • 举报
回复
哦,我又想起了一个规则:作用域是在编译时确定的.

你的第一种情况在编译时不能确定作用域所以就错了^_^
yafizyh 2005-03-11
  • 打赏
  • 举报
回复
加上{}之后,内部的变量成了局部变量。处了{}就没他了。
iamwiner 2005-03-11
  • 打赏
  • 举报
回复
switch也是同理.打个{}变量定义的作用域只在{}内,不会出现到运行时才知道是否定义这种情况
iamwiner 2005-03-11
  • 打赏
  • 举报
回复
明白了吗?实际上我也没有看过相关知识.
但我可以肯定{}只是代替一个作用域.不是什么过程
另外,你的第一种情况是可以举出让编译器可能出错的例子,但第二种情况却举不出这种错误的例子.
iamwiner 2005-03-11
  • 打赏
  • 举报
回复
不是,只是作用域不同.
举个例子:

goto SECTION;

int a = 10;
.
.
.
SECTION:
{
//other code
}
a = 15;

编译时a的作用域是可以到下面的,但运行时跳过了定义a的这个语句,所以可能产生错误.

但打个{}就不同了,不会出现这种情况编译和运行时互相矛盾的错误!
ayanamiwww 2005-03-11
  • 打赏
  • 举报
回复
还有,当switch的时候也会出现类似的初始化被超越,也是加上{} 就可以,问什么呢?

以前看过这样的代码好像是正确的
int i;
{
int i = 0;
}

这个{}是不是代表另一个过程呢?怎么理解呢?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧