關(guān)于c語(yǔ)言的一個(gè)小bug詳解
不多說(shuō),說(shuō)了都是累贅!直接看代碼吧!
<SPAN style="FONT-SIZE: 14px">#include <stdio.h>
int array[] = {23, 34, 12, 17, 204, 99, 16};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int main (void)
{
int d = -1, x;
if( d <= (TOTAL_ELEMENTS -2))
{
x = array[d+1];
printf("d <= TOTAL_ELEMENTS-2\n");
}
else
{
printf("the bug is out!\n");
}
return 0;
}
</SPAN>
有興趣的可以先猜猜結(jié)果是啥,然后再運(yùn)行下,看看結(jié)果是不是和自己想的一樣? 其中的道理又是什么呢?
gcc 下如行結(jié)果如下:
<SPAN style="FONT-SIZE: 14px">zy@pc:~/workspace/homework/commonfunc$ ./a.out
the bug is out!
</SPAN>
<SPAN style="FONT-SIZE: 14px">
TOTAL_ELEMENTS </SPAN>
所定義的值是unsigned int 類型(因?yàn)閟izeof()返回類型是無(wú)符號(hào)的),if 語(yǔ)句在有符號(hào)和無(wú)符號(hào)之間測(cè)試相等性,所以將
d升級(jí)為無(wú)符號(hào)(unsigned int )類型,-1轉(zhuǎn)換成 unsigned int 的結(jié)果是一個(gè)非常巨大的正整數(shù)的,致使表達(dá)式為假,
所以要想結(jié)果正確,先得強(qiáng)轉(zhuǎn)類型
<SPAN style="FONT-SIZE: 14px">if( d <= (int)(TOTAL_ELEMENTS -2))
</SPAN>
這樣就能得到正確的結(jié)果啦!
對(duì)無(wú)符號(hào)的建議;
1 盡量不要在代碼中使用無(wú)符號(hào)類型,以免增加不必要的復(fù)雜性,尤其是僅僅因?yàn)闊o(wú)符號(hào)數(shù)不存在負(fù)值而用它來(lái)表示
2 盡量使用int這樣有符號(hào)類型,這樣在涉及升級(jí)混合類型的復(fù)雜細(xì)節(jié)時(shí),不必?fù)?dān)心邊界情況(-1 翻譯成非常大的整數(shù))
3 只有在使用位段和二進(jìn)制掩碼時(shí),才使用無(wú)符號(hào)數(shù)。而且應(yīng)該在表達(dá)式中使用強(qiáng)制類型轉(zhuǎn)換,使操作數(shù)均為有符號(hào)數(shù)或者無(wú)符號(hào)數(shù),這樣不必由編譯器來(lái)選擇結(jié)果的類型。
相關(guān)文章
VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏
這篇文章主要介紹了VisualStudio 使用Visual Leak Detector檢查內(nèi)存泄漏的相關(guān)資料,需要的朋友可以參考下2015-07-07C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法示例
這篇文章主要介紹了C++使用遞歸函數(shù)和棧操作逆序一個(gè)棧的算法,結(jié)合實(shí)例形式分析了C++遞歸函數(shù)與逆序棧的相關(guān)操作技巧,需要的朋友可以參考下2017-05-05C++ 哈夫曼樹(shù)對(duì)文件壓縮、加密實(shí)現(xiàn)代碼
這篇文章主要介紹了C++ 哈夫曼樹(shù)對(duì)文件壓縮、加密實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動(dòng)態(tài)數(shù)組的區(qū)別分析
這篇文章主要介紹了C++中關(guān)于[]靜態(tài)數(shù)組和new分配的動(dòng)態(tài)數(shù)組的區(qū)別分析,很重要的概念,需要的朋友可以參考下2014-08-08C++之CNoTrackObject類和new delete操作符的重載實(shí)例
這篇文章主要介紹了C++之CNoTrackObject類和new delete操作符的重載實(shí)例,是C++程序設(shè)計(jì)中比較重要的概念,需要的朋友可以參考下2014-10-10