首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >名为“循环外”的标签不能从循环外部访问?

问名为“循环外”的标签不能从循环外部访问?
EN

Stack Overflow用户
提问于 2016-09-21 11:24:32
回答 1查看 104关注 0票数 1

这是我在调试的代码,当我发现这个(我觉得很有趣)。

代码语言:javascript
复制
int function(void) {
    static int i, state = 0;
    switch (state) {
        case 0: goto LABEL0;
        case 1: goto LABEL1;
    }
    LABEL0: /* start of function */
    for (i = 0; i < 10; i++) {
        state = 1; /* so we will come back to LABEL1 */
        return i;
        LABEL1:; /* resume control straight after the return */
    }
}

因此,我观察到的是,当标签在A循环goto LABEL1;中时,这个语句-从不将PC直接移动到标签之后的代码。到目前一切尚好。当我将代码更改为这个并再次调试时,事情变得非常混乱:

代码语言:javascript
复制
int function(void) {
    static int i, state = 0;
    switch (state) {
        case 0: goto LABEL0;
        case 1: goto LABEL1;
    }
   for(;;){
       i++;
    LABEL0: /* start of function */
    for (i = 0; i < 10; i++) {
        state = 1; /* so we will come back to LABEL1 */
        return i;
        LABEL1:; /* resume control straight after the return */
    }
   }
}

我故意将LABEL0嵌套到循环中,以便确认观察到的结果。虽然观测结果没有证实预期的结果。这一次,goto语句将程序直接发送到它所引用的标签之后的代码(LABEL0:),尽管标签被嵌套到虚拟for(;;)循环中)。

我真的希望你能理解这个场景。有人能解释一下这种行为(我找不到一致性)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-21 11:38:28

调试器通常不能非常准确地显示PC,因为单个源行由多个操作码组成,有时根本没有操作代码,因此它不能总是将PC映射到正确的源行。

在第一个示例中,在LABEL1之后放置一个虚拟语句,以查看是否在那里设置了PC。

如果调试器支持“反汇编”视图,则切换到“反汇编视图”或类似视图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39615239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档