一段看起來很簡單C代碼,預期結果是輸出array數組。
#include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d = -1;d <= (TOTAL_ELEMENTS - 2); d++) printf("%d\n", array[d+1]); return 0; }
代碼編譯運行后,結果不是想要的那個數組,而是空值,這是很多人就會想到宏定義了,原因是宏定義是沒辦法獲得數組的長度。
可我們把for循環改一下就有不同的結果了
for(d = -1; d <= ((int)TOTAL_ELEMENTS-2); d++)
把TOTAL_ELEMENTS強制轉換成int類型的,結果就變成了:
。。。。。。。。。。這是我們想要的結果,那就是說宏定義沒問題。
我們在原來的main()函數中加一句
int array_length = TOTAL_ELEMENTS;
這樣和類型強轉的效果應該是一樣的,跟蹤監視后得到下面的結果:
提示是沒有找到符號"TOTAL_ELEMENTS",但是array_length卻有值。。。。。。。很郁悶
接着,我們在for循環里處理數組長度
for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)
現在,輸出結果應該就是我們想要的那個數組了。可結果呢,啥都沒輸出。。。。。。。更郁悶
那就繼續跟蹤監視
好像都沒問題,不過注意它們的類型,是無符號整形(unsigned int),而循環條件d是整形(int),並且d的初始值為-1,不再無符號整形(unsigned int)定義范圍之內,現在看來好像是類型的問題了,那我們將循環條件d的初始值改為0試試:
#include<stdio.h> #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d = 0; d <= (TOTAL_ELEMENTS - 1); d++) printf("%d\n", array[d]); return 0; }
輸出的結果是
結果正是我們想要的。沒有進行強制類型轉換,也沒有進行二次賦值,只是將循環條件d的初始值定義在了無符號整形(unsigned int)的范圍之內。
我們再做個小測試
int main() { int array[] = {23,34,12,17,204,99,16}; int d = -1; if(d <= (sizeof(array) / sizeof(array[0])) -2) printf("先有雞\n"); else printf("先有蛋\n"); return 0; }
從代碼看來,應該是輸出“先有雞”。不過這次結果又是事與願違,輸出的是“先有蛋”。
所以建議在寫代碼的時候盡量避免使用無符號類型,同時也盡量避免有符號類型和相應的無符號類型進行比較等。
================================================================
本人才疏學淺和其他原因,沒有進行更深入的研究,只是偶爾看到的IT面試題,感興趣簡單的測了一下。
不過跟蹤監視后,CX0017:錯誤:沒有找到符號"TOTAL_ELEMENTS",還是沒有找到原因,有知道的大神不妨指點一二。。。。。。