精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

assert與const的使用技巧

汽車電子技術 ? 來源:微亮筆記 ? 作者:PASSION ? 2023-02-21 15:37 ? 次閱讀

我們在編寫一段代碼時,往往會有許多不可避免的bug出現。這時如何快速地找出并修改這些bug就變得至關重要,本期我們將介紹一些在調試中使我們的代碼變得更健全與完善的一些小技巧。

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

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

下面我來舉幾個具體的使用場景:

<模擬實現庫函數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;
}

如此,我們就成功地完成了任務,但我們如果用到今天提到的“assert”,則會使我們的代碼更加健全,不容易在發生錯誤的情況下使程序崩潰。

下面來看改進版:

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

以上改進版的函數的優勢就在于當我們出現傳參錯誤(例如將空指針NULL傳入函數)時,系統就會自動報錯而不是運行錯誤甚至崩潰。

當然,上述代碼還有很多值得改動和優化的地方,我們后續會集中介紹。

  • const的使用技巧

const是一個修飾符,它可以一個變量轉換為常量,且無法修改。

下面我們用相同的例子來解釋const的使用方法

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

這是我們剛才所寫的函數,但在我們函數的具體使用過程中如果將源頭數組與目標數組弄混,程序運行就會錯誤且不易被察覺。這時我們如果使用const 修飾一下源頭數組,再出現以上錯誤系統就會自動報錯,從而使錯誤被發現。使用如下:

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

這樣,當我們傳參錯誤導致源頭數組被更改時,系統就會自動提示我們代碼出現問題了。

值得一提的是雖然用const 修飾的變量理論上無法被更改,但實際上我們仍可以通過對該變量的地址解引用來實現對此變量的更改:

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

    int* p=&num;
    *p=20//但可以通過此方式來更改
}

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 邏輯
    +關注

    關注

    2

    文章

    832

    瀏覽量

    29452
  • 程序
    +關注

    關注

    116

    文章

    3778

    瀏覽量

    80858
  • 斷言
    +關注

    關注

    0

    文章

    8

    瀏覽量

    6685
收藏 人收藏

    評論

    相關推薦

    C語言const關鍵字的用法

    const是constant的簡寫,用來定義常量,如果一個變量被const修飾,那么它的值就不能再被改變。
    發表于 06-29 09:51 ?447次閱讀

    C語言中assert的使用

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

    C語言assert(斷言)簡介

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

    如何使用assert

    在經過對其進行一定了解之后,對其作用及用法有了一定的了解,assert()的用法像是一種“契約式編程”,在我的理解中,其表達的意思就是,程序在我的假設條件下,能夠正常良好的運作,其實就相當于一個
    發表于 04-05 11:05

    如何避免Xil_Assert系列宏導致的死循環

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

    怎樣去解決RT-Thread系統中ASSERT失效的問題呢

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

    MFC中ASSERT常見用法

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

    怎么理解Assert中的斷言語句?

    為什么項目中的代碼需要有Assert斷言語句?
    的頭像 發表于 03-03 14:12 ?2715次閱讀

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

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

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

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

    【C語言進階】利用assert高效排查你的C程序

    【C語言進階】利用assert高效排查你的C程序
    的頭像 發表于 08-31 13:27 ?2079次閱讀

    C語言中const的用法介紹

    C語言標準庫中很多函數的參數都被 const 限制了,但我們在以前的編碼過程中并沒有注意這個問題,經常將非 const 類型的數據傳遞給 const 類型的形參,這樣做從未引發任何副作用,原因就是上面講到的,將非
    發表于 01-05 10:03 ?552次閱讀

    C語言|const關鍵字介紹

    最近看別人的項目, 發現const使用比較多, 通過使用const來保護變量, 這篇推文就來簡單回顧一下相關知識!
    的頭像 發表于 05-25 15:11 ?520次閱讀

    const關鍵字應用總結

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

    const 和指針變量使用

    有時候我們希望定義這樣一種變量,它的值不能被改變,在整個作用域中都保持固定。例如,用一個變量來表示班級的最大人數,或者表示緩沖區的大小。為了滿足這一要求,可以使用const關鍵字對變量加以限定
    的頭像 發表于 06-22 10:43 ?457次閱讀