欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

C語言異常處理(五十二)-創(chuàng)新互聯(lián)

    我們今天來看下異常處理,在看 C++ 的異常處理之前,先來看看 C 語言中的異常處理。那么什么是異常呢?在程序運行過程中可能會產(chǎn)生異常,異常(Exception)與 Bug 的區(qū)別是:異常是程序運行時可預(yù)料的執(zhí)行分支,而 Bug 是程序中的錯誤,是不被預(yù)期的運行方式。

鐵東ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

        下來我們來看看異常和 Bug 的對比:a> 異常比如運行時產(chǎn)生除 0 的情況,需要打開的外部文件不存在,數(shù)組訪問時越界;b> Bug 是使用野指針,堆數(shù)組使用結(jié)束后未釋放,選擇排序無法處理長度為 0 的數(shù)組。在 C 語言中的經(jīng)典處理方式為:if ... else ... 。if 語句中處理的是正常情況代碼邏輯,else 語句中處理的是異常情況代碼邏輯。

        我們還是以代碼為例來看看除法操作異常的處理

#include <iostream>
#include <string>

using namespace std;

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        ret = 0;
    }
    
    return ret;
}

int main()
{
    cout << divide(1, 1) << endl;
    cout << divide(1, 0) << endl;

    return 0;
}

        我們看看編譯結(jié)果

C 語言異常處理(五十二)

        執(zhí)行的結(jié)果是正確的,但是如果我們打印的是 0/1 的結(jié)果呢?我們就不知道執(zhí)行的到底是正確的情況還是異常的情況。那么我們在上面程序中的 divide 函數(shù)中添加一個參數(shù),用來表示執(zhí)行結(jié)果的正確與否,根據(jù)這個參數(shù)的值來判斷執(zhí)行是否正常。程序如下

#include <iostream>
#include <string>

using namespace std;

double divide(double a, double b, int* valid)
{
    const double delta = 0.000000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
        
        *valid = 1;
    }
    else
    {
        *valid = 0;
    }
    
    return ret;
}

int main()
{
    int valid = 0;
    double r = divide(1, 0, &valid);
    
    if( valid )
    {
        cout << "r = " << r << endl;
    }
    else
    {
        cout << "Divided by zero..." << endl;
    }

    return 0;
}

        我們來看看編譯結(jié)果

C 語言異常處理(五十二)

        再來試試 0/1 呢

C 語言異常處理(五十二)

        我們看到結(jié)果已經(jīng)正確的執(zhí)行了。但是這個程序有個缺陷,便是 divide 函數(shù)需要 3 個參數(shù),難以理解它的用法,而且 divide 函數(shù)調(diào)用后必須判斷 valid 代表的結(jié)果,當 valid 為 true 時,運算結(jié)果正常;當 valid 為false 時,運算結(jié)果出現(xiàn)異常。在 C 語言還有一種異常處理的方式,通過 setjmp() 和 longjmp() 進行判斷。下來我們來講講這兩個函數(shù)的原型及其意思:a> int setjmp(jmp_buf env) 是將當前上下文保存在 jmp_buf 結(jié)構(gòu)體中;b> void longjmp(jmp_buf env, int val) 從 jmp_buf 結(jié)構(gòu)體中恢復(fù) setjmp() 保存的上下文,最終從 setjmp 函數(shù)調(diào)用點返回,返回值為 val;下來我們通過示例代碼來進行分析

#include <iostream>
#include <string>
#include <csetjmp>

using namespace std;

static jmp_buf env;

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        longjmp(env, 1);
    }
    
    return ret;
}

int main()
{
    if( setjmp(env) == 0 )
    {
        double r = divide(1, 0);
        
        cout << "r = " << r << endl;
    }
    else
    {
        cout << "Divided by zero..." << endl;
    }

    return 0;
}

        在它進入 main 函數(shù)的 if 語句后,會將 0 保存在當前的 env 中,然后 setjmp 函數(shù)會保存當前的上下文信息。然后執(zhí)行 divide 函數(shù),進入到 divide 函數(shù)中,會進入到 else 分支。longjmp 函數(shù)則會將 1 保存到 env 中并將程序的執(zhí)行流跳轉(zhuǎn)到 setjmp 處,此時 env 為 1,因此條件不成立,所以會打印出 Divided by zero...,我們來看看編譯結(jié)果

C 語言異常處理(五十二)

        我們再來看看 1/1 呢,進入到 divide 函數(shù)中,它會執(zhí)行 if 語句進行正常的計算之后直接便會返回 ret,便會輸出結(jié)果


C 語言異常處理(五十二)

        雖然這是兩個參數(shù),但是它有一定的缺陷。setjmp() 和 longjmp() 的引入就必然涉及到使用全局變量,暴力跳轉(zhuǎn)導(dǎo)致代碼的可讀性降低,其本質(zhì)還是 if ... else ... 異常處理方式。它的暴力跳轉(zhuǎn)會破壞 C 語言的結(jié)構(gòu)化特性(順序執(zhí)行、選擇執(zhí)行、循環(huán)執(zhí)行)。C 語言中的經(jīng)典異常處理方式會使得程序中邏輯混入大量的處理異常的代碼。正常邏輯代碼和異常處理代碼混合在一起,導(dǎo)致代碼迅速膨脹,難以維護。那么在 C++ 中肯定便會有更好的異常處理方式,我們后面會繼續(xù)學(xué)習。通過對 C 語言中異常處理的學(xué)習,總結(jié)如下:1、程序中不可避免的會發(fā)生異常;2、異常是在開發(fā)階段就可以預(yù)見的運行時問題;3、C 語言中通過經(jīng)典的 if ... else ... 方式處理異常,在 C++ 中存在更好的異常處理方式。

        歡迎大家一起來學(xué)習 C++ 語言,可以加我QQ:243343083。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

分享名稱:C語言異常處理(五十二)-創(chuàng)新互聯(lián)
轉(zhuǎn)載來源:http://aaarwkj.com/article48/cchehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣移動網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計虛擬主機自適應(yīng)網(wǎng)站、網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
少妇高潮试看二十分钟| 欧美日韩一区二区三区久久精品| 巨乳人妻一区二区三区| 不卡av免费在线网址| 黄色18禁网站在线看| 欧美日韩国产一区二区的| 国产极品美女在线观看网站| 一区二区三区国产精品乱码| 久久亚洲一区二区内射| 亚洲激情欧美激情在线| 国产精品自拍激情在线观看| 免费国产污网站在线观看| 天堂8在线最新版av| 九九热这里只有免费精品| 午夜福利不卡片在线观看| 国产av一区二区三区最新精品| 亚洲国产99在线精品一区| 日韩av在线免费在线观看| 日韩成人高清免费在线| 欧美色精品人妻在线最新| 丰满人妻少妇精品一区二区三区| 熟妇丰满多毛的大阴户| 成人黄色暖暖韩日视频| 日韩av天堂免费网站| 国产三级精品av在线| 日本国产一区二区在线观看 | 亚洲av日韩av在线不卡一区| 亚洲最大av免费在线看| 中文字幕一区二区三天| 国产成人综合久久三区北岛玲| 91麻豆精品国产久久久| 人妻露脸国语对白字幕| 蜜臀国产午夜在线视频| 亚洲成色在线综合剧情网站| 久青青国产综合自拍视频在线观看| 久草午夜福利视频免费观看| 国产真实乱偷精品视频免| 日本在线一区二区三区免费视频| 成人av影视中文字幕| 久久一区二区视频在线观看| 麻豆精品国产一区二区91|