【发布时间】:2016-06-20 12:52:01
【问题描述】:
在下面的 C 代码中,f 调用 g,g 调用 h。请注意h 中的goto,但是:如果a 满足某个条件,它将跳转回f。
void h(int a)
{
if (a > 10)
goto out;
}
void g(int a, int b)
{
h(a);
}
void f(int a, int b)
{
g(a, b);
return;
out:
printf("b: %d\n", b);
}
我的问题是:如果goto 被触发,堆栈将如何? g 和 h 会被拆散吗? f 是否仍会打印正确的 b 值? (或者只有在我幸运的情况下才会正确打印?)
(拜托,我不想讨论这是否是一个好的做法,或者是否应该使用它。另外,考虑到实际代码足够复杂,以至于编译器不够聪明,例如优化g out)
[如果重要的话,我可以详细说明我为什么要这样做——我认为不重要]
【问题讨论】:
-
AFAIK 标签必须是功能范围的区域设置。你不能在标准 C 中做到这一点。
-
您的代码无法为我编译,就像 LP 注释状态一样,goto 是函数范围的语言环境
-
C标准中没有堆栈,你的问题缺乏基础。而且您的代码无效。
-
从一个函数中的代码跳转到另一个函数中的代码是非常糟糕的。