在以下C代码中,f
拨打g
,g
拨打h
。请注意goto
中的h
:如果f
满足某个条件,它将跳回a
。
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)
[我可以详细说明为什么我这样做,如果重要 - 我认为不这样做]
答案 0 :(得分:4)
问题是无效的,因为它不能像这样完成:你只能在一个函数中goto
,而不能在函数之间。
要在功能之间跳转,您可以使用setjmp
/ longjmp
。
答案 1 :(得分:4)
这将导致标准C中的未定义行为。
C Language Standard的6.8.6.1/1:
goto语句中的标识符应指定位于的标签 在封闭功能的某个地方。 goto语句不得跳转 来自具有可变修改的标识符范围之外的 键入到该标识符范围内。
答案 2 :(得分:1)
C编程中的goto语句提供了来自' goto'的无条件跳转。标记声明在同一个函数中。
标签是单个函数的本地标签,您不能在不同的函数之间跳转。
注意 - 在我看来,强烈建议不要使用goto语句。
参考:http://www.tutorialspoint.com/cprogramming/c_goto_statement.htm
答案 3 :(得分:-1)
您不能这样做,因为标签是每个特定功能的本地标签。但是,最接近的标准等价物是setjmp()和longjmp()函数对。这应该工作。 :)