c - 无法从循环外部访问在循环外部调用的标签?

标签 c

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

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 */
    }
}

所以我观察到这个语句 -goto LABEL1; 永远不会将 PC 直接移动到标签 WHEN THE LABEL IS INSIDE A LOOP 之后的代码。到目前为止,一切都很好。当我将代码更改为此并再次调试时,事情变得非常困惑:

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( ;;) 循环。

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

最佳答案

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

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

如果您的调试器支持,另一种方法是切换到“反汇编 View ”或类似 View 。

关于c - 无法从循环外部访问在循环外部调用的标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39615239/

相关文章:

c - 如何确保没有人可以访问我的网络服务器中文档根目录之外的文件

c - 函数指针 typedef 的前向声明

c++ - C/C++ : How to properly convert "unsigned int *" value to "unsigned int"?

c# - 在C#中调用c dll

比较字符串和指针?比较 C 中的字符串

没有malloc的C编程

c - USART3初始化STM32F103RB

c - 如何将多行写入 C 中的输出文件?

c - 这个功能是如何工作的?

c - 这个来自内核代码的宏中的##是什么意思