程序跳转语句goto,setjmp,longjmp

betball贝博app C语言 457 次浏览 没有评论

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]

发表评论

邮箱地址不会被公开。

Go