我們?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=#
*p=20;//但可以通過(guò)此方式來(lái)更改
}
實(shí)際上此操作并不合法,如果我們不想讓num通過(guò)地址被改變,我們也可以用const來(lái)修飾 “int* p” ,從而使*p(也就是num)無(wú)
-
邏輯
+關(guān)注
關(guān)注
2文章
833瀏覽量
29469 -
程序
+關(guān)注
關(guān)注
117文章
3787瀏覽量
81038 -
斷言
+關(guān)注
關(guān)注
0文章
8瀏覽量
6691
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論