c语言 goto 和 longjmp 的区别
来源:互联网 发布:华泰证券交易软件 编辑:程序博客网 时间:2024/05/29 15:22
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");}}
输出结果是:
:
如果将
二:longjmp 用法
goto test; 改成 goto test2; 编译都过去。 可想 goto 只能 返回 函数内 的 语句。
这个 涉及到 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标准库》
0 0
- c语言 goto 和 longjmp 的区别
- C语言的结构跳转 (goto / longjmp)
- c语言的setjmp和longjmp
- C语言中的跳转goto&&setjmp&&longjmp sigsetjmp siglongjmp
- C语言中的跳转goto&&setjmp&&longjmp sigsetjmp siglongjmp
- 详解C的异常处理机制(goto\setjmp longjmp)
- setjmp和longjmp goto应用
- C语言中的break、continue和goto三者的区别与用法
- C语言之循环结构中break、continue、goto、return和exit的区别
- 浅析C语言的非局部跳转:setjmp和longjmp
- C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- 浅析C语言的非局部跳转:setjmp和longjmp
- c语言的goto语句
- C语言中setjmp和longjmp函数
- C语言中的setjmp和longjmp函数
- C 语言中 setjmp 和 longjmp
- 用Js的eval解析JSON中的注意点
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
- 快速矩阵幂HDU2276
- XML---基本语法
- Google Play Developer AP Authorization
- c语言 goto 和 longjmp 的区别
- 安卓面试题
- 设置vs debug模式下的线程名称
- Picasso,listview和scrollview混合嵌套的问题
- Json对象为变量时的使用方式
- initialization error SQL*NET not properly installed
- linux线程私有数据之一键多值技术TSD池
- ext combobox默认值
- ADS如何修改默认工作目录