免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2724 | 回复: 8
打印 上一主题 下一主题

问个C goto问题 [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-19 10:18 |只看该作者 |倒序浏览
实在不明白goto
#include <stdio.h>

int main(void)
{
        int i=0;
        int j=1;

        if(i)
                if(j > 10)
                        goto hello2;


hello:
        fprintf(stderr, "Hello, C!\n");
        return;
hello2:
        fprintf(stderr, "Hello, Perl!\n");
        return;
hello3:
        fprintf(stderr, "Hello!\n");
        return;
}


问题一: 这里为什么执行了hello这个label?我怎么觉得不应该执行任何label
问题二:一个label怎么样算结束?也就是label后面如果想加入主程序的代码(不属于label的范围)是否可以?

[ 本帖最后由 FinalBSD 于 2009-3-19 10:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-19 10:22 |只看该作者
1,因为前面的跳转条件不满足,所以继续往下执行直至第一个return;
2,可以,在主程序代码的return后加label,不过如果想执行完label再继续执行主程序代码记的跳回来

汗,所以说不鼓励使用goto。。。

论坛徽章:
0
3 [报告]
发表于 2009-03-19 10:24 |只看该作者
条件都不成立,应当顺序执行啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2009-03-19 10:26 |只看该作者
哦,谢谢楼上2位,我以为label里面的代码必须有前面满足的条件才会被执行,如果不满足就当略过。第二个问题还不是很明白,呵呵

论坛徽章:
0
5 [报告]
发表于 2009-03-19 10:54 |只看该作者
hello 是缺省情况下执行的
一个 label 在遇到下一个 label 开始的时候结束。如果后面的 return ,就代表这个 label 后面就是整个程序的结束了,此外还可以跟 break 等各种语句,但是结束一个 label 的只有另一个 label 或者程序结束。

论坛徽章:
0
6 [报告]
发表于 2009-03-19 11:06 |只看该作者
原帖由 FinalBSD 于 2009-3-19 10:26 发表
哦,谢谢楼上2位,我以为label里面的代码必须有前面满足的条件才会被执行,如果不满足就当略过。第二个问题还不是很明白,呵呵

lable只是一个位置的标记,没有其他用处

因此,一般被用做跳转的目标

lable不是函数,因此它没有结束的概念

但是lable有一个概念:"后面的语句"

论坛徽章:
0
7 [报告]
发表于 2009-03-19 11:08 |只看该作者
hello肯定是上面条件不满足goto条件,然后顺序执行的啦

论坛徽章:
0
8 [报告]
发表于 2009-03-19 11:29 |只看该作者
label就是一个地址标识嘛。。不过是在函数体内的。。相当于short jmp

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2009-03-19 12:03 |只看该作者
了解了,谢谢各位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP