C语言:goto标签的作用域到底是什么(疑惑)?

网上查看了很多资料都说:goto到标签以后就按照顺序执行,这个标签只是一个跳转地址跟作用域真没什么关系。但是goto有作用范围,文件内。(我想应该是正确吧!)可是我发现C... 网上查看了很多资料都说:goto到标签以后就按照顺序执行,这个标签只是一个跳转地址跟作用域真没什么关系。但是goto有作用范围,文件内。(我想应该是正确吧!)
可是我发现 C Primer Plus 中文第五版 181 页的例子:
(1) if(size > 12)
goto a;
goto b;
a: cost = cost * 1.05
flag = 2;
b: bill = cost * flag;
书上说等效于:

if(size > 12)
{

cost = cost * 1.05;
flag = 2;
}
bill = cost * flag;
按照网上的理论(goto到标签以后就按照顺序执行):为什么不是?
if(size > 12)
{

cost = cost * 1.05;
flag = 2;
bill = cost * flag;

}
bill = cost * flag;
(2) if(ibex > 14)
goto a;
sheds = 2;
goto b;
a: sheds = 3;
b: help = 2 * sheds;
书上说等效于:
if(ibex > 14)
sheds = 3;
else
sheds = 2;
help = 2 * sheds;
同理,按照网上的理论(goto到标签以后就按照顺序执行):为什么不是?
if(ibex > 14)
{

sheds = 3;
help = 2 * sheds;
}

else
sheds = 2;
help = 2 * sheds;
是书上错误,还是网上理论有错,或自己没有理解正确?
展开
 我来答
风若远去何人留
推荐于2018-02-28 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部

标签本身没有作用域的,只是一个标志点。

但是goto本身有限制,只能是当前函数。所以,从这个角度来说,标签的作用域也可以说是当前函数。

比如

void func()
{
    int a;
    a=0;
    loop:
    a++;
    if(a<10) goto loop;
    printf("%d",a);
}

这个程序中,loop标签就与goto配合起到了跳转作用。

对于goto来说,这个标签只要是在本函数内的就是合法的,无论是在goto前还是goto后。


但是,如下程序:

int a = 0;
void func1(void)
{
    loop:
    printf("%d",a);
}

void func2(void)
{
     a++;
     if(a<10)goto loop;
}

在func2中调用goto使用了func1中的标签loop,在编译的时候就会报错。因为使用goto时只会在本函数中查找该标签。

郝在益
推荐于2017-11-26 · TA获得超过2079个赞
知道小有建树答主
回答量:1496
采纳率:54%
帮助的人:632万
展开全部
if(ibex > 14)
    sheds = 3;
else
    sheds = 2;
help = 2 * sheds;


if(ibex > 14)
{
    sheds = 3;
    help = 2 * sheds;
}
else
    sheds = 2;
help = 2 * sheds;

有区别吗?这2个是没有任何区别的。

在你看来,区别是help = 2 * sheds;这句话的地方,但是,你发现了没有,无论是上面的一个,还是下面的一个。不管if语句成立或者不成立,help = 2 * sheds;这句语句都是会执行的。所以,虽然在写法上有一点区别,但是结果确实完全是一样的。

这也是一种简洁程序的一种思路,你现在有可能体会不到,等你以后编写多了,你就能体会到这种简洁的思路了。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
金色潜鸟
2013-09-09 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5721万
展开全部
(1) if(size > 12) goto a;
goto b;
a: cost = cost * 1.05
flag = 2;
b: bill = cost * flag;
等效于:
if (size >12) {
a: cost = cost * 1.05
flag = 2;
b: bill = cost * flag;
} else {
b: bill = cost * flag;
};
==========
(2) if(ibex > 14) goto a;
sheds = 2;
goto b;
a: sheds = 3;
b: help = 2 * sheds;
等效于:
if(ibex > 14) {
a: sheds = 3;
b: help = 2 * sheds;
} else {
sheds = 2;
b: help = 2 * sheds;
};
========
goto 语句用于本函数范围。
goto 语句 可以在本域内 转向。
goto 语句 可从本域转 本域的外层域。
goto 语句 不可从本域转 本域的内层域。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友50cab7a
2013-09-09 · TA获得超过504个赞
知道小有建树答主
回答量:320
采纳率:0%
帮助的人:171万
展开全部
goto 只能在函数内跳转。就这么简单。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
贾林明0123
2018-08-31
知道答主
回答量:3
采纳率:0%
帮助的人:2308
展开全部
刚才写了段代码实验了以下,好像是书上的问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式