来自Lua中的编程第3版第38页
练习4.5:你能解释为什么Lua有
goto
不能跳出函数的限制吗? (提示:你将如何实现该功能?)
我猜测为什么会如此:
a = f()
但f在该行代码后执行了goto
,那么a
的价值是多少?我想知道作者将如何回答这个问题。也许我会给他发电子邮件。
与此同时,其他人是否有一些想法?
答案 0 :(得分:9)
你的猜测暗示了答案。原因是因为goto
语句及其目标必须位于同一堆栈帧中。 goto
之前和之后的程序上下文需要相同,否则跳转到的代码将不会在其正确的堆栈帧中运行,并且其行为将是未定义的。由于同样的原因,C中的goto
具有相同的限制。
C标准库还提供了longjmp()
和setjump()
,它们允许您从当前堆栈帧中实现“goto”形式。 setjmp()
保存当前堆栈上下文。然后,您可以调用longjmp()
将堆栈展开回您调用setjmp()
的位置。在调用longjmp()
的函数退出后,您无法调用setjump()
。