关于非局部跳转

  在看《程序员的自我修养》时看到一个以前没见过的东西,为此记录下来。(当然事后才知道原来早就被人写烂了,啊哈哈哈)

  非局部跳转在C语言中是一个备受争议的机制。使用非局部跳转,可以实现从一个函数体内向另一个事先登记过的函数体内跳转,不必担心堆栈混乱。

请看实例:

// setjmp.c
// 非局部跳转测试用例

#include<setjmp.h>
#include<stdio.h>

jmp_buf b;

void jmp_test()
{
    longjmp(b, 1); // 跳到setjmp(b)处,并且指定setjmp(b)返回值为这里的第二个参数
}

int main()
{
    if(setjmp(b)) // 正常返回的时候返回0
    {
        printf(" world\n");
    }
    else
    {
        printf("hello ");
        jmp_test();
        printf("---- 永远不会被打出来 ----\n");  // 这句话真的没有打出来,说明函数返回后没有在这里继续执行下去
    }

    printf("---- main() end ----\n");
    return 0;
}

运行结果如下:

longjmp() 的作用就是让程序的执行流回到当初setjmp()的时刻,并且返回由longjmp指定的返回值(第二个参数)

就好像让程序”时光倒流“。

当然,这绝对不是结构化编程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏决胜机器学习

设计模式专题(五)——工厂方法模式

设计模式专题(五)——工厂方法模式 (原创内容,转载请注明来源,谢谢) 一、概述 1、工厂方法与简单工厂模式区别 工厂方法模式与简单工厂模式不同 简单工厂模...

3899
来自专栏java一日一条

Java异常有多慢?

实际上,真正要讨论的问题并不是,“相对‘那些不会发生错误的代码’来说,‘那些以异常形式上报的错误’会有多慢?”,因为你可能也认同“已接受的回答”。相反,真正的问...

3522
来自专栏FreeBuf

逆向工厂(二):静态分析技术

* 本文原创作者:追影人,本文属FreeBuf原创奖励计划,未经许可禁止转载 前言 [逆向工厂]第一章节中介绍了逆向技术的相关基础知识,其中提到逆向的两种形式:...

4598
来自专栏xingoo, 一个梦想做发明家的程序员

《深入浅出Nodejs》—— 读后总结

这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完。 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Node...

1955
来自专栏海说

深入理解计算机系统(3.2)---数据格式、访问信息以及操作数指示符

  本文的内容其实可以成为汇编语言的基础,因为汇编语言大部分时候是在操作一些我们平时开发看不到的东西,因此本文的目的就是搞清楚,汇编语言都是在操作些什么东西。或...

932
来自专栏AzMark

Python 学习之模块

1353
来自专栏有趣的django

1.python简介

简介 1、python语言介绍 python的创始人:Guido Van Rossum 2、python是一门什么样的语言 编程语言主要从以下几个角度进行分类:...

4065
来自专栏程序员宝库

Java 异常处理的 9 个最佳实践

在 Java 中,异常处理是个很麻烦的事情。初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出。 所以很多开发团队约定一些原则...

3519
来自专栏佳爷的后花媛

h文件和c文件的区别include本身只是一个简单的文件包含预处理命令,即为把include的后面文件放到这条命令这里,除此之外,没有其它的用处(至少我也样认为).

其实在H文件里写函数也无所谓,只是不符合习惯而已。只要按照以上的格式写,一个H文件添加多少次都无所谓,

2412
来自专栏别先生

Javascript创建对象的学习和使用

1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>javascript对象的学习</title> ...

2049

扫码关注云+社区

领取腾讯云代金券