0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

assert與const的使用技巧

汽車(chē)電子技術(shù) ? 來(lái)源:微亮筆記 ? 作者:PASSION ? 2023-02-21 15:37 ? 次閱讀

我們?cè)诰帉?xiě)一段代碼時(shí),往往會(huì)有許多不可避免的bug出現(xiàn)。這時(shí)如何快速地找出并修改這些bug就變得至關(guān)重要,本期我們將介紹一些在調(diào)試中使我們的代碼變得更健全與完善的一些小技巧。

本期主要介紹assert與const的使用技巧

  • assert的使用技巧
    斷言(assertion)是一種在程序中的一階邏輯(如:一個(gè)結(jié)果為真或假的邏輯判斷式),目的為了表示與驗(yàn)證軟件開(kāi)發(fā)者預(yù)期的結(jié)果--當(dāng)程序執(zhí)行到斷言的位置時(shí),對(duì)應(yīng)的斷言應(yīng)該為真。若斷言不為真時(shí),程序會(huì)中止執(zhí)行,并給出錯(cuò)誤信息。
    斷言是一種編程中常用的手段。在通常情況下,斷言就是將一個(gè)返回值總是需要為真的判別式放在語(yǔ)句中,用于排除在設(shè)計(jì)的邏輯上不應(yīng)該產(chǎn)生的情況。比如一個(gè)函數(shù)總需要輸入在一定的范圍內(nèi)的參數(shù),那么程序員就可以對(duì)該參數(shù)使用斷言,以迫使在該參數(shù)發(fā)生異常的時(shí)候程序退出,從而避免程序陷入邏輯的混亂。
    從一些意義上講,斷言并不是正常程序所必需的,不過(guò)對(duì)于程序調(diào)試來(lái)說(shuō),通常斷言能夠幫助程序開(kāi)發(fā)者快速定位那些違反了某些前提條件的程序錯(cuò)誤。

下面我來(lái)舉幾個(gè)具體的使用場(chǎng)景:

<模擬實(shí)現(xiàn)庫(kù)函數(shù)strcpy>

#include
void my_strcpy(char* dest,char* src)
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}
int main()
{
    //strcpy-->字符串拷貝
    char arr1[]="################";
    char arr2[]="bit";
    my_strcpy(arr2,arr1);
    printf("%s\\n",arr1);
    return 0;
}

如此,我們就成功地完成了任務(wù),但我們?nèi)绻玫浇裉焯岬降摹癮ssert”,則會(huì)使我們的代碼更加健全,不容易在發(fā)生錯(cuò)誤的情況下使程序崩潰。

下面來(lái)看改進(jìn)版:

void my_strcpy(char* dest,char* src)
{
    assert(dest != NULL);//斷言
    assert(src != NULL);//斷言
    
     while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

以上改進(jìn)版的函數(shù)的優(yōu)勢(shì)就在于當(dāng)我們出現(xiàn)傳參錯(cuò)誤(例如將空指針NULL傳入函數(shù))時(shí),系統(tǒng)就會(huì)自動(dòng)報(bào)錯(cuò)而不是運(yùn)行錯(cuò)誤甚至崩潰。

當(dāng)然,上述代碼還有很多值得改動(dòng)和優(yōu)化的地方,我們后續(xù)會(huì)集中介紹。

  • const的使用技巧

const是一個(gè)修飾符,它可以一個(gè)變量轉(zhuǎn)換為常量,且無(wú)法修改。

下面我們用相同的例子來(lái)解釋const的使用方法

#include
void my_strcpy(char* dest,char* src)
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

這是我們剛才所寫(xiě)的函數(shù),但在我們函數(shù)的具體使用過(guò)程中如果將源頭數(shù)組與目標(biāo)數(shù)組弄混,程序運(yùn)行就會(huì)錯(cuò)誤且不易被察覺(jué)。這時(shí)我們?nèi)绻褂胏onst 修飾一下源頭數(shù)組,再出現(xiàn)以上錯(cuò)誤系統(tǒng)就會(huì)自動(dòng)報(bào)錯(cuò),從而使錯(cuò)誤被發(fā)現(xiàn)。使用如下:

#include
void my_strcpy(char* dest,const char* src)//注意此處const
{
    while(*src != '\\0')
    {
       *dest = *src;
       src++;
       dest++;
    }
    *dest=*src;
}

這樣,當(dāng)我們傳參錯(cuò)誤導(dǎo)致源頭數(shù)組被更改時(shí),系統(tǒng)就會(huì)自動(dòng)提示我們代碼出現(xiàn)問(wèn)題了。

值得一提的是雖然用const 修飾的變量理論上無(wú)法被更改,但實(shí)際上我們?nèi)钥梢酝ㄟ^(guò)對(duì)該變量的地址解引用來(lái)實(shí)現(xiàn)對(duì)此變量的更改:

int main ()
{
    const int num=10;//雖然無(wú)法直接改變num的值

    int* p=&num;
    *p=20;//但可以通過(guò)此方式來(lái)更改
}

實(shí)際上此操作并不合法,如果我們不想讓num通過(guò)地址被改變,我們也可以用const來(lái)修飾 “int* p” ,從而使*p(也就是num)無(wú)

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 邏輯
    +關(guān)注

    關(guān)注

    2

    文章

    833

    瀏覽量

    29469
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81038
  • 斷言
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

    6691
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言const關(guān)鍵字的用法

    const是constant的簡(jiǎn)寫(xiě),用來(lái)定義常量,如果一個(gè)變量被const修飾,那么它的值就不能再被改變。
    發(fā)表于 06-29 09:51 ?464次閱讀

    C語(yǔ)言中assert的使用

    assert意思是斷言,常用在程序的DEBUG版本中。
    發(fā)表于 07-21 14:51 ?846次閱讀

    C語(yǔ)言assert(斷言)簡(jiǎn)介

    assert的功能,條件為真,程序繼續(xù)執(zhí)行;如果斷言為假(false),則程序終止。
    的頭像 發(fā)表于 11-17 16:33 ?1162次閱讀
    C語(yǔ)言<b class='flag-5'>assert</b>(斷言)簡(jiǎn)介

    如何使用assert

    在經(jīng)過(guò)對(duì)其進(jìn)行一定了解之后,對(duì)其作用及用法有了一定的了解,assert()的用法像是一種“契約式編程”,在我的理解中,其表達(dá)的意思就是,程序在我的假設(shè)條件下,能夠正常良好的運(yùn)作,其實(shí)就相當(dāng)于一個(gè)
    發(fā)表于 04-05 11:05

    如何避免Xil_Assert系列宏導(dǎo)致的死循環(huán)

    。  void Xil_Assertconst char8 *File, s32 Line)  {  /* if the callback has been set then invoke
    發(fā)表于 01-08 16:29

    怎樣去解決RT-Thread系統(tǒng)中ASSERT失效的問(wèn)題呢

    (*rt_assert_hook)(const char *ex, const char *func, rt_size_t line);/** * This function will set a
    發(fā)表于 04-12 17:54

    MFC中ASSERT常見(jiàn)用法

      在C++的消息公告板上經(jīng)常可以看到出現(xiàn)ASSERT錯(cuò)誤的求助信息。雖然這通常是希望消除ASSERT錯(cuò)誤的幫助請(qǐng)求,但是幾乎所有的求助者都認(rèn)為ASSERT本身是罪惡的。我完全能理解一
    發(fā)表于 09-07 15:55 ?19次下載

    怎么理解Assert中的斷言語(yǔ)句?

    為什么項(xiàng)目中的代碼需要有Assert斷言語(yǔ)句?
    的頭像 發(fā)表于 03-03 14:12 ?2747次閱讀

    C++基礎(chǔ)語(yǔ)法之volatile、assert()和sizeof()

    中取值) const 可以是 volatile (如只讀的狀態(tài)寄存器) 指針可以是 volatile assert() 斷言,是宏,而非函數(shù)。assert
    的頭像 發(fā)表于 09-09 09:48 ?1312次閱讀

    C++中const以及this指針的使用

    const 作用 修飾變量,說(shuō)明該變量不可以被改變; 修飾指針,分為指向常量的指針(pointer to const)和自身是常量的指針(常量指針,const pointer); 修飾引用,指向常量
    的頭像 發(fā)表于 09-23 11:39 ?2019次閱讀

    【C語(yǔ)言進(jìn)階】利用assert高效排查你的C程序

    【C語(yǔ)言進(jìn)階】利用assert高效排查你的C程序
    的頭像 發(fā)表于 08-31 13:27 ?2126次閱讀

    C語(yǔ)言中const的用法介紹

    C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中很多函數(shù)的參數(shù)都被 const 限制了,但我們?cè)谝郧暗木幋a過(guò)程中并沒(méi)有注意這個(gè)問(wèn)題,經(jīng)常將非 const 類(lèi)型的數(shù)據(jù)傳遞給 const 類(lèi)型的形參,這樣做從未引發(fā)任何副作用,原因就是上面講到的,將非
    發(fā)表于 01-05 10:03 ?569次閱讀

    C語(yǔ)言|const關(guān)鍵字介紹

    最近看別人的項(xiàng)目, 發(fā)現(xiàn)const使用比較多, 通過(guò)使用const來(lái)保護(hù)變量, 這篇推文就來(lái)簡(jiǎn)單回顧一下相關(guān)知識(shí)!
    的頭像 發(fā)表于 05-25 15:11 ?541次閱讀

    const關(guān)鍵字應(yīng)用總結(jié)

    C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性
    的頭像 發(fā)表于 05-26 09:06 ?574次閱讀

    const 和指針變量使用

    有時(shí)候我們希望定義這樣一種變量,它的值不能被改變,在整個(gè)作用域中都保持固定。例如,用一個(gè)變量來(lái)表示班級(jí)的最大人數(shù),或者表示緩沖區(qū)的大小。為了滿足這一要求,可以使用const關(guān)鍵字對(duì)變量加以限定
    的頭像 發(fā)表于 06-22 10:43 ?487次閱讀