C中的跳转语句[非goto]

 1 #include  < stdio.h >
 2 #include  < setjmp.h >
 3 jmp_buf buf;
 4
 5 static   void  babana()
 6 {
 7     printf( " in babana()\n " );
 8     longjmp(buf, 1 );
 9     printf( " never see me\n " );
10 }

11
12 int  main()
13 {
14      if (setjmp(buf))
15      {
16         printf( " back in main\n " );
17     }

18      else
19      {
20         printf( " first time through\n " );
21         babana();
22     }

23      return   0 ;
24 }
 setjmp()首先被调用,并且返回0.
goto是不能跳出当前函数的,而longjmp甚至可以跳到其他文件的函数中去(估计就是为什么要在名字里加个long的原因吧,:)).
但 longjmp只能跳回到曾经去过的地方,而setjmp正是标记到过的地方,所以从这角度来想的话,longjmp更像是"从何处来"而不是goto"去哪里".

这也可以所就是C++中" catch "," throw " 的一个起源吧.

你可能感兴趣的:(C中的跳转语句[非goto])