精品理论电影在线_日韩视频一区二区_一本色道精品久久一区二区三区_香蕉综合视频

C語言一個微妙的Bug

發布時間: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被轉化為非常大的正整數)。

  只有在使用位段和二進制掩碼的時候,才可以使用無符號數。應該在表達式中使用強制類型轉化,是操作數均為有符號數或者無符號數,避免編譯器來選擇結果的類型。

百分百考試網 考試寶典

立即免費試用