非局部跳转

#include <setjmp.h> #include <stdio.h> jmp_buf b; void f() { longjmp(b,1); } int main() { if(setjmp(b)) printf("World!"); else { printf("Hello "); f(); } }

 

 

 大家猜猜结果!

这段代码按常理不论setjmp返回什么,也只会打印出“Hello ”和“World!”之一,然而事实上的输出是:

  Hello World!

  实际上,当setjmp正常返回的时候,会返回0,因此会打印出“Hello ”的字样。而longjmp的作用,就是让程序的执行流回到当初setjmp返回的时刻,并且返回由longjmp指定的返回值(longjmp的参数2),也就是1,自然接着会打印出“World!”并退出。换句话说,longjmp可以让程序“时光倒流”回setjmp返回的时刻,并改变其行为,以至于改变了未来。

  是的,这绝对不是结构化编程。

你可能感兴趣的:(非局部跳转)