LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1199|回复: 12

gcc中的goto只能往后跳,不能往前跳吗?

[复制链接]
发表于 2004-5-20 02:24:22 | 显示全部楼层 |阅读模式
以前从来都不用goto语句的,今天突然心血来潮,而且在那个地方使用goto方便很多,于是就使用了goto,可居然编译都通不过。
后来我试了往后面跳,却又是可以通过编译的。
似乎ANSI C中没有这个规定吧?
发表于 2004-5-20 07:06:49 | 显示全部楼层
GOTO的指令是只看LABEL的, 和你往前往后跳没关系的,我老用GOTO了。
发表于 2004-5-20 08:54:19 | 显示全部楼层
goto的跳转限于函数体内,请注意。
发表于 2004-5-20 09:15:30 | 显示全部楼层
最初由 home_king 发表
goto的跳转限于函数体内,请注意。


对对, 我以前在CLASS里加GOTO被教授给扣了分, 说没人在structure里用GOTO的, 但不知道什么原因
发表于 2004-5-20 09:18:27 | 显示全部楼层
呵呵,在下只擅长C及汇编。
至于C++,爱莫能助,我自己也害怕这种语言。

ps:apt-get的C++源码就看得我够呛得。:p
 楼主| 发表于 2004-5-20 11:42:21 | 显示全部楼层

发现了错误所在

原来我在变量定义之前加了label。
像这样

  1. AGAIN:
  2.           int i = 0;
复制代码

它就会报在int之前有语法错误。
但这是为什么?标准C中是这样规定的吗?
发表于 2004-5-20 11:49:29 | 显示全部楼层
LABEL不能加在定义前啦, 因为事实上定义一个变量是让系统分配一个内存空间给变量, 你在它前面加了LABEL, 让后用GOTO理论上是让系统再一次分配内存空间给这个变量, 这是不合法的啦。 LABEL必须要在定义之外。
 楼主| 发表于 2004-5-20 11:57:25 | 显示全部楼层

分析得有道理

但是我如果不会goto到这的话,也就不会有问题呀
可它既然根本就不让我在变量定义前加label。
这个是不是有点霸道?
发表于 2004-5-20 12:04:37 | 显示全部楼层
应该这么说, 你加LABEL理论上可以, 因为LABEL事实上是不会被编译进去的, 可以作为COMMENT, 用来辨认,比如你在定义前加definition:, 但我不会这么做啦, 但你用GOTO来回旋到那个definition:就不合法了。因为定义只能一次。这个和汇编语言有点像, 每个PROGRAM都有至少两个主要的SECTIONS, data和code, data是用来定义用的, 而code是程序的主杆。
 楼主| 发表于 2004-5-20 12:09:20 | 显示全部楼层

谢谢

不过确实在变量定义之前加label是没什么意义的,因为不能跳转到这里来。
可能编译器为稳妥起见吧,才这样规定的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表