这是我正在调试的代码,当我发现这个(我觉得很有趣)时。
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/