#include<setjmp.h>
#include<stdio.h>
#include<stdlib.h>
static jmp_buf  buf;main()
{volatile  int b;b =3;if(setjmp(buf)!=0)  {printf("%d ", b);  exit(0);}b=5;longjmp(buf , 1);
}
//请问输出是?

setjmp
与刺激的abort()和exit()相比,goto语句看起来是处理异常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函数内部的标号上,而不能将控制权转移到所在程序的任意地点(当然,除非你的所有代码都在main体中)。
为了解决这个限制,C函数库提供了setjmp()和longjmp()函数,它们分别承担非局部标号和goto作用。头文件<setjmp.h>申明了这些函数及同时所需的jmp_buf数据类型。
原理非常简单:
1.setjmp(j)设置“jump”点,用正确的程序上下文填充jmp_buf对象j。这个上下文包括程序存放位置、栈和框架指针,其它重要的寄存器和内存数据。当初始化完jump的上下文,setjmp()返回0值。
2. 以后调用longjmp(j,r)的效果就是一个非局部的goto或“长跳转”到由j描述的上下文处(也就是到那原来设置j的setjmp()处)。当作为长跳转的目标而被调用时,setjmp()返回r或1(如果r设为0的话)。(记住,setjmp()不能在这种情况时返回0。)
通过有两类返回值,setjmp()让你知道它正在被怎么使用。当设置j时,setjmp()如你期望地执行;但当作为长跳转的目标时,setjmp()就从外面“唤醒”它的上下文。你可以用longjmp()来终止异常,用setjmp()标记相应的异常处理程序。在你举得代码中,第一次运行到if(setjmp(buf)!=0)  时,setjmp(buf)设置了一个GOTO点,然后返回值为0, 所以不进入if,然后继续运行到longjmp(buf , 1);这个时候会跳到setjmp(buf)处,同时返回longjmp的第二个参数值,即1. 此时if判断成立,就输出b,值为5,退出程序。
通俗的讲:
setjmp和logjmp是配合使用的,用它们可以实现跳转的功能,和goto语句很类似,不同的是goto只能实现在同一个函数之内的跳转,而setjmp和logjmp可以实现在不同函数间的跳转用法:
  1. 首先用setjmp设置跳转的地点,setjmp的参数buf是用来保存设置跳转点时的函数使用的重要数据,当从其他函数跳转回来,如果不用这个保存的数据恢复当前函数的一些数据的话,跳转回来是不能运行的。第一次设置的时候setjmp返回值为0

  2. 使用longjmp就可以跳转到setjmp的地方了,参数buf就是使用setjmp的时候保存的,而第二个参数会在跳转以后把这个值让setjmp返回的,也就是longjmp第二个参数,就是跳转到setjmp之后setjmp函数要返回的值


这个代码里运行步骤1.先执行setjmp,因为是第一次设置跳转点,返回值是0,不执行if语句块里的语句,2.然后执行b=5,b的值就是5了3.再执行longjmp跳转之后, 最后再执行setjmp, 这时setjmp会返回1(也就是longjmp的第二个参数指定的值),就会执行if语句块里的语句----打印之后终止程序,这时b的值是5,就会打印出5来

c语言的jmp_buf函数相关推荐

  1. fig r函数_R语言基础绘图函数散点图~跟着Nature Communications学画图~Figure1

    今天继续 跟着Nature Communications学画图系列第二篇.学习R语言基础绘图函数画散点图. 对应的 Nature Communications 的论文是 Fecal pollution ...

  2. C语言数组测试函数,(完整word版)C语言数组与函数阶段测试题答案---(20200807070313)(8页)-原创力文档...

    } } C语言数组与函数阶段测试题答案 一.选择题( 18*2=36 分) 1. 在定义" int a[5][6]; "后,第 11个元素是 [ C ] A.a[2][5] B . ...

  3. 「杂谈」如何写好R语言apply家族函数

    感觉好久没发有关R语言的博客了.这一年来,我着手开发了两个R包,但基本没怎么发博客. 原因也很简单,可能是我个人的私心吧,或者说是典型的"理论研究者"的"通病" ...

  4. R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator )

    R语言使用basename函数获取数据链接地址中的文件名称(removes all of the path up to and including the last path separator (i ...

  5. R语言使用unzip函数解压压缩文件(Extract or List Zip Archives)

    R语言使用unzip函数解压压缩文件(Extract or List Zip Archives) 目录 R语言使用unzip函数解压压缩文件(Extract or List Zip Archives) ...

  6. R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表、对转化为长表的数值数据列进行离散化、pivot_wider将数据转化为宽表

    R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表.对转化为长表的数值数据列进行离散化.pivot_wider将数据转化为宽表 ...

  7. R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA)、使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图、箱图显示主效应

    R语言使用aov函数进行双因素方差分析(Two-way factorial ANOVA).使用HH包中的interaction2wt函数为任何阶的双因素方差分析可视化主效应和交互作用图(Main ef ...

  8. R语言使用trimws函数:trimws函数去除(删除、remove)字符串头尾的空格

    R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格 目录 R语言使用trimws函数:trimws函数去除(删除.remove)字符串头尾的空格

  9. R语言使用integrate函数进行函数积分计算实战

    R语言使用integrate函数进行函数积分计算实战 目录 R语言使用integrate函数进行函数积分计算实战 #自定义函数 #积分操作

最新文章

  1. (18)修改 PTE 实现挂物理页读写空指针
  2. 数学有多震撼?!我真的没有在开车!
  3. 高性能Javascript HTML集合访问的学习笔记
  4. 大数据_Hbase-shell命令_操作hbase_完成对表的增删改查---Hbase工作笔记0005
  5. vfp 修改本机时间_借助novapdfPro 将VFP报表无感生成PDF文件
  6. 【通信】基于matlab多径衰落信道仿真【含Matlab源码 338期】
  7. html input提交按钮无法使用,无法找到并单击提交按钮使用mshtml.HTMLInputElement
  8. Linux下合成pdf
  9. 怎么用计算机测出来体脂,keep软件测体脂率的在哪 keep怎么测体脂
  10. 如何申请Gmail邮箱?_manok_新浪博客
  11. jpa 人大金仓数据库方言_人大金仓+springboot配置
  12. 前端语法重温从0到1入门
  13. python爬取王者荣耀英雄素材图案例
  14. 华为十年(转贴)原华为牛人写的
  15. 怎么可以修改pr基本图形中的文字_PR教程03 | 如何增加字幕
  16. spread运算符_JavaScript中的Spread运算符有什么用?
  17. 【python机器学习】——patsy的简介、安装、使用方法之详细攻略
  18. css 签名字体,SVG 花样字体文本的自动签名动画
  19. redis.conf之save配置项解读
  20. Ubuntu 15.10 安装 小米/360 2代等随身WIFI驱动

热门文章

  1. 下拉选择框插件chosen
  2. 郑清 - 日常作息表 - December - 2019
  3. 快速启动程序几种方法
  4. 基于Hadoop文件存储系统的研发
  5. JJJ-1 early_irq_init
  6. 网优谷告诉你:锚文本链接怎么做
  7. 游戏服务器之防御式开发
  8. CSS中line-height属性
  9. SQLExpress 一键安装
  10. 使用 Python 分析《我不是药神》豆瓣电影短评