關於c說話的一個小bug詳解。本站提示廣大學習愛好者:(關於c說話的一個小bug詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是關於c說話的一個小bug詳解正文
不多說,說了都是包袱!直接看代碼吧!
<SPAN >#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>
有興致的可以先猜猜成果是啥,然後再運轉下,看看成果是否是和本身想的一樣? 個中的事理又是甚麼呢?
gcc 下如行成果以下:
<SPAN >zy@pc:~/workspace/homework/commonfunc$ ./a.out
the bug is out!
</SPAN>
<SPAN >
TOTAL_ELEMENTS </SPAN>
所界說的值是unsigned int 類型(由於sizeof()前往類型是無符號的),if 語句在有符號和無符號之間測試相等性,所以將
d進級為無符號(unsigned int )類型,-1轉換成 unsigned int 的成果是一個異常偉大的正整數的,導致表達式為假,
所以要想成果准確,先得強轉類型
<SPAN >if( d <= (int)(TOTAL_ELEMENTS -2))
</SPAN>
如許就可以獲得准確的成果啦!
對無符號的建議;
1 盡可能不要在代碼中應用無符號類型,以避免增長不用要的龐雜性,特別是僅僅由於無符號數不存在負值而用它來表現
2 盡可能應用int如許有符號類型,如許在觸及進級混雜類型的龐雜細節時,不用擔憂界限情形(-1 翻譯成異常年夜的整數)
3 只要在應用位段和二進制掩碼時,才應用無符號數。並且應當在表達式中應用強迫類型轉換,使操作數均為有符號數或許無符號數,如許不用由編譯器來選擇成果的類型。