为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
暮色呼如 2019-03-23 10:15:09
网上查看了很多资料都说:goto到标签以后就按照顺序执行,这个标签只是一个跳转地址跟作用域真没什么关系。但是goto有作用范围,文件内。(我想应该是正确吧!)可是我发现 C Primer Plus 中文第五版 181 页的例子:(1) if(size > 12)goto a;goto b;a: cost = cost * 1.05flag = 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;elsesheds = 2;help = 2 * sheds;同理,按照网上的理论(goto到标签以后就按照顺序执行):为什么不是?if(ibex > 14){sheds = 3;help = 2 * sheds;}elsesheds = 2;help = 2 * sheds;是书上错误,还是网上理论有错,或自己没有理解正确?
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞


1

2

3

4

5

if(ibex > 14)

    sheds = 3;

else

    sheds = 2;

help = 2 * sheds;

1

2

3

4

5

6

7

8

if(ibex > 14)

{

    sheds = 3;

    help = 2 * sheds;

}

else

    sheds = 2;

help = 2 * sheds;

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

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

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

 

 


查看完整回答
反对 回复 2019-03-25
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

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

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

比如

1

2

3

4

5

6

7

8

9

void func()

{

    int a;

    a=0;

    loop:

    a++;

    if(a<10) goto loop;

    printf("%d",a);

}

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

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

但是,如下程序:

1

2

3

4

5

6

7

8

9

10

11

12

int a = 0;

void func1(void)

{

    loop:

    printf("%d",a);

}

 

void func2(void)

{

     a++;

     if(a<10)goto loop;

}

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



查看完整回答
反对 回复 2019-03-25
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

(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 语句 不可从本域转 本域的内层域。



查看完整回答
反对 回复 2019-03-25
  • 3 回答
  • 0 关注
  • 1026 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信