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

网上查看了很多资料都说: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;
是书上错误,还是网上理论有错,或自己没有理解正确?

哔哔one
浏览 1124回答 3
3回答

噜噜哒

标签本身没有作用域的,只是一个标志点。但是goto本身有限制,只能是当前函数。所以,从这个角度来说,标签的作用域也可以说是当前函数。比如123456789void&nbsp;func(){&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;a=0;&nbsp;&nbsp;&nbsp;&nbsp;loop:&nbsp;&nbsp;&nbsp;&nbsp;a++;&nbsp;&nbsp;&nbsp;&nbsp;if(a<10)&nbsp;goto&nbsp;loop;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d",a);}这个程序中,loop标签就与goto配合起到了跳转作用。对于goto来说,这个标签只要是在本函数内的就是合法的,无论是在goto前还是goto后。但是,如下程序:123456789101112int&nbsp;a&nbsp;=&nbsp;0;void&nbsp;func1(void){&nbsp;&nbsp;&nbsp;&nbsp;loop:&nbsp;&nbsp;&nbsp;&nbsp;printf("%d",a);}&nbsp;void&nbsp;func2(void){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(a<10)goto&nbsp;loop;}在func2中调用goto使用了func1中的标签loop,在编译的时候就会报错。因为使用goto时只会在本函数中查找该标签。

神不在的星期二

(1) if(size > 12) goto a;goto b;a: cost = cost * 1.05flag = 2;b: bill = cost * flag;等效于:if (size >12) {a: cost = cost * 1.05flag = 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 语句 不可从本域转 本域的内层域。

蓝山帝景

12345if(ibex&nbsp;>&nbsp;14)&nbsp;&nbsp;&nbsp;&nbsp;sheds&nbsp;=&nbsp;3;else&nbsp;&nbsp;&nbsp;&nbsp;sheds&nbsp;=&nbsp;2;help&nbsp;=&nbsp;2&nbsp;*&nbsp;sheds;与12345678if(ibex&nbsp;>&nbsp;14){&nbsp;&nbsp;&nbsp;&nbsp;sheds&nbsp;=&nbsp;3;&nbsp;&nbsp;&nbsp;&nbsp;help&nbsp;=&nbsp;2&nbsp;*&nbsp;sheds;}else&nbsp;&nbsp;&nbsp;&nbsp;sheds&nbsp;=&nbsp;2;help&nbsp;=&nbsp;2&nbsp;*&nbsp;sheds;有区别吗?这2个是没有任何区别的。在你看来,区别是help = 2 * sheds;这句话的地方,但是,你发现了没有,无论是上面的一个,还是下面的一个。不管if语句成立或者不成立,help = 2 * sheds;这句语句都是会执行的。所以,虽然在写法上有一点区别,但是结果确实完全是一样的。这也是一种简洁程序的一种思路,你现在有可能体会不到,等你以后编写多了,你就能体会到这种简洁的思路了。
打开App,查看更多内容
随时随地看视频慕课网APP