我們在編寫一段代碼時,往往會有許多不可避免的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=#
*p=20;//但可以通過此方式來更改
}
實際上此操作并不合法,如果我們不想讓num通過地址被改變,我們也可以用const來修飾 “int* p” ,從而使*p(也就是num)無
-
邏輯
+關注
關注
2文章
833瀏覽量
29464 -
程序
+關注
關注
117文章
3785瀏覽量
81003 -
斷言
+關注
關注
0文章
8瀏覽量
6689
發布評論請先 登錄
相關推薦
評論