C语言的结构跳转 (goto / longjmp)

本文介绍了C语言中的两种跳转方式:1) 使用`goto`进行局部跳转,虽然不推荐但有时能简化多循环的控制;2) 利用`setjmp`和`longjmp`实现非局部跳转,这种跳转可以跨越函数,但需要注意不一定会调用析构函数,且移植性较差。通过示例代码展示了这两种跳转的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)      goto

goto 只能在一个函数内跳转。建议少用,使得程序维护起来容易出错;但是,在有多个循环情况下跳转,有时用goto可以使得问题变得简单。

 

 

一个例子

class A

{

public:

A(){}

~A(){}
};

 

           int main()

{

{

                A a;

                goto Label1;

}

Label1:

cout<<”end”<<endl;

return 0;
}     

2)      setjmp/longjmp

非局部跳转(nonlocal goto),可用于在不同函数内跳转,但是不会调用析构函数(vc++是会的,但是别的编译器可能不会,不具备移植性)。使用步骤如下:

l       include <setjmp.h>

l       jmp_buf JumpBuffer

//跳转的位置结构

l       setjmp(JumpBuffer)

保存当前的位置,将来跳转到这里

l       longjmp(JumpBuffer, 整数)

这个整数会成为setjmp的返回值。

 

         一个例子

         jmp_buffer jmpbuf;  //用以保存处理器相关的状态信息(栈信息等)

 

           void Func()

{

cout << “ get in ” <<endl;

A a;

longjmp(jmpbuf, 1);

cout << “ never get here ”<<endl;
}

 

           int main()

{

cout << “ get in main ” <<endl;

if( setjmp (jmpbuf ) == 0 )

{

cout<<”set lable”<<endl;

Func();
}

                else //1

{

        cout<<” jmp to here”<<endl;

}

}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值