第一次接触跳转是goto,只知道goto不能随便用,但实际上只是没有弄懂原理,现在接触到setjmp,又把两种跳转学习了一下发现一些不同点和需要严格注意的地方。
一、goto用的时候只能在当前函数段里,也就是局部里。
如在主函数里,就不能直接跳转到子函数中,原因是在子函数不执行的时候,goto的标识符没有在栈里面,就不能被跳转到。
main()
{
int i=0;
A:
i++;
if(i<5) goto A;
printf("%d",i);
}
上面是可以的,但下面这个就是错误的
fun()
{
int i=0;
A:
printf("%d",i);
}
main ()
{
goto A:
}
当然在主函数里添加标号,由子函数跳转过去也是不可以的,会报错。
二、使用setjmp就可以跨越式的跳转,但是设置比较麻烦了,首先需要添加头文件setjmp.h,还需要定义jmp_buf A;
可以直接把goto的用法中,标号用setjmp(A);替换,goto用longjmp(A,1);替换;
当然这样也只是函数内部跳转。
如果要实现函数间跳转,需要让setjmp设置的标号一直处于栈空间里,也就是说这个标号一直在运行空间里,跳转的时候才能找到。个人觉得这个标号放在主函数里,从子函数跳转是完全没问题的,但如果放到子函数里,跳转的局限性就比较大了。
像这样把标号放到主函数中,就可以从子函数中跳转到对应位置:
#include "stdio.h"
#include "setjmp.h"
int a=0;
jmp_buf A;
void pa(void)
{
printf("%d\t",a++);
if(a<10) longjmp(A,0);
}
int main()
{
setjmp(A);
pa();
printf("\n");
return 0;
}