c语言 goto 和 longjmp 的区别

c语言 goto 和 longjmp  基本用法 与 区别

C语言的goto 和 longjmp 都可以跳出正常的控制流。但 goto 只能在 函数内 使用。

一.goto 基本用法,
1.标识符+ ":"  标记 这一行可以使用 goto, 例如:底下例子:  test:if (i == 10)
2.goto 标识符;          底下例子: goto test;

上代码解释:

void testGoto(){
	test2:printf("print test2");
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 10;
	test:if (i == 10)
	{
		printf("i == 10\n");
		i = 20;
		goto test;
	}
	else if(i == 20)
	{
		printf("i == 20");
	}
}

输出结果是:


如果将 
goto test; 改成 goto test2; 编译都过去。 可想 goto 只能 返回 函数内 的 语句。

二:longjmp 用法
这个 涉及到 C标准库 的 setjmp 库。
这个库很简单 就 三个东西
jmp_buf 类型: 保存 上下文 执行环境的 变量
setjmp :  设置 jmp_buf 变量的 函数
longjmp : 返回 jmp_buf 变量 的 位置

#include <csetjmp>
static jmp_buf errorGoto;

void testsetJmp(int a,int b){
	if (b == 0)
	{
		printf("error\n");
		longjmp(errorGoto,1);
	}
}

int _tmain(int argc, _TCHAR* argv[])
{

	switch (setjmp(errorGoto))
	{
	case 0:
		printf("first run\n");
		testsetJmp(10,0);
		break;
	case 1:
		printf("next run");
		testsetJmp(10,20);
		break;
	case 2:
		printf("333333333333");
	default:
		break;
	}
}

需要说明的是 
1.setjmp 函数的 返回值: 第一次执行的时候返回的是0,以后执行 都返回 longjmp 调用的 第二个参数的值,如果longjmp 第二个参数的值为0,则返回1.
2.setjmp 有一些使用限制。
下图摘自:《C标准库》




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值