zoukankan      html  css  js  c++  java
  • 关于非局部跳转

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

      非局部跳转在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
    ");
        }
        else
        {
            printf("hello ");
            jmp_test();
            printf("---- 永远不会被打出来 ----
    ");  // 这句话真的没有打出来,说明函数返回后没有在这里继续执行下去
        }
    
        printf("---- main() end ----
    ");
        return 0;
    }

    运行结果如下:

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

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

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

  • 相关阅读:
    day09
    初识socket
    java正则表达式
    Servlet 3.0 新特性详解
    spring利用PropertiesFactoryBean管理属性配置文件properties
    MyBatis获取插入记录的自增主键
    深入学习理解java-ThreadLocal
    Mybatis批量执行语句
    MyBatis使用二级缓存
    编码的理解
  • 原文地址:https://www.cnblogs.com/xcywt/p/4978900.html
Copyright © 2011-2022 走看看