c中的setjump和longjump解析
阿新 • • 發佈:2018-11-10
在做題中遇到的兩個函式,覺得有點意思,也是解題時理解程式碼的一個關鍵點,於是寫下來
我們知道c中goto這個指令不能跨函式跳躍,而setjump和longjump會解決這個問題。
標頭檔案:<setjump.h>
1.setjump(env) 其中env代表環境變數,表示將程式中的上下文儲存在env中。
2.longjump:void longjmp( std::jmp_buf env, int status ); env為指代 setjmp 所儲存的函式執行狀態的變數,
status表示從setjmp返回的值,若它等於0,則以1代替。常用於做異常處理。它的返回是在setjmp中。
下面示例一個程式碼:
#include<iostream>
#include<setjmp.h>
using namespace std;
jmp_buf env;
double divide(double a, double b) {
if (b == 0)
{
longjmp(env, 2);
}
return a / b;
}
int main()
{
if (setjmp(env) == 0) //longjmp會在這裡返回
{
cout << "ok"<<endl;
divide(2, 0);
}
else {
cout << "not ok";
}
return 0;
}
實質上main中的if判斷被執行了兩次。