發布時間:2011-09-16 共1頁
1 #include <stdio.h>
2
3 int array[] = {23, 24 ,12, 204};
4 #define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
5
6 void main()
7 {
8 int d = -1;
9 if(d <= TOTAL_ELEMENTS)
10 printf("TRUE\n");
11 }
運行結果是不打印TRUE。
解釋:TOTAL_ELEMENT所定義的值是unsigned int類型,因為sizeof()返回類型是無符號數。if語句在signed int和unsigned int之間測試大小關系,所以d被提升為unsigned int類型。 -1轉換成unsigned int 的結果將是一個非常巨大的正整數,導致if判斷為假。
解決方法:可以修改第四行為:#define TOTAL_ELEMENTS (int)(sizeof(array)/sizeof(array[0]))
建議:
盡量不要在代碼中使用無符號類型,以免增加不必要的復雜性。尤其是,不要僅僅因為無符號數不存在負值(如年齡、國債等)而用它來表示數量。盡量使用int那樣的有符號類型,這樣在涉及升級混合類型的復雜細節時,不必擔心邊界的情況(如-1被轉化為非常大的正整數)。
只有在使用位段和二進制掩碼的時候,才可以使用無符號數。應該在表達式中使用強制類型轉化,是操作數均為有符號數或者無符號數,避免編譯器來選擇結果的類型。