goto语句仅适用于函数内的跳转,相当于汇编中的JMP语句。
[cce_cpp] #include <stdio.h> void compare(int a,int b){ if(a>b) goto dayu; else goto xiaoyu; dayu: printf(">\n"); xiaoyu: printf("<\n"); } int main(){ compare(1,2); /* if(a>b) goto dayu; else goto xiaoyu;*/ } [/cce_cpp]
上述代码中的注释掉的部分,如果编译的话会报错,说明不能在main函数中跳转到compare函数中的标记。
想要进行全局跳转,需要用到setjmp.h下面的函数
需要先定义jmp_buf,即函数栈顶指针
然后通过setjmp(指针名)设置跳转点
通过longjmp(函数栈,返回值);
函数栈告诉程序跳转到哪,返回值告诉程序从哪跳来
[cce_cpp] #include<stdio.h> #include <setjmp.h> jmp_buf env; jmp_buf env2; void f(void){ longjmp(env,10); longjmp(env2,20); } int main() { int val; val = setjmp(env); printf("val:%d\n",val); if(val!=0){ printf("val:%d\n",val); val = setjmp(env2); printf("after long jump,the value is %d\n",val); } else{ printf("val:%d\n",val); printf("ready to jump\n"); f(); } return 0; } /* val:0 val:0 ready to jump val:10 val:10 after long jump,the value is 20 after long jump,the value is 20 与正确答案有出入(最后两行) 原因:这是跳转,不是函数调用 所以,不会再去执行第二条跳转 而且每一次设置跳转点后,函数返回值为0 val:0 val:0 ready to jump val:10 val:10 after long jump,the value is 0 */ [/cce_cpp]