有趣的IT面試題
一段看起來(lái)很簡(jiǎn)單C代碼,預(yù)期結(jié)果是輸出array數(shù)組。
- #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;
- }
代碼編譯運(yùn)行后,結(jié)果不是想要的那個(gè)數(shù)組,而是空值,這是很多人就會(huì)想到宏定義了,原因是宏定義是沒(méi)辦法獲得數(shù)組的長(zhǎng)度。
可我們把for循環(huán)改一下就有不同的結(jié)果了
- for(d = -1; d <= ((int)TOTAL_ELEMENTS-2); d++)
把TOTAL_ELEMENTS強(qiáng)制轉(zhuǎn)換成int類型的,結(jié)果就變成了:
。。。。。。。。。。這是我們想要的結(jié)果,那就是說(shuō)宏定義沒(méi)問(wèn)題。
我們?cè)谠瓉?lái)的main()函數(shù)中加一句
- int array_length = TOTAL_ELEMENTS;
這樣和類型強(qiáng)轉(zhuǎn)的效果應(yīng)該是一樣的,跟蹤監(jiān)視后得到下面的結(jié)果:
提示是沒(méi)有找到符號(hào)"TOTAL_ELEMENTS",但是array_length卻有值。。。。。。。很郁悶
接著,我們?cè)趂or循環(huán)里處理數(shù)組長(zhǎng)度
- for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)
現(xiàn)在,輸出結(jié)果應(yīng)該就是我們想要的那個(gè)數(shù)組了。可結(jié)果呢,啥都沒(méi)輸出。。。。。。。更郁悶
那就繼續(xù)跟蹤監(jiān)視
好像都沒(méi)問(wèn)題,不過(guò)注意它們的類型,是無(wú)符號(hào)整形(unsigned int),而循環(huán)條件d是整形(int),并且d的初始值為-1,不再無(wú)符號(hào)整形(unsigned int)定義范圍之內(nèi),現(xiàn)在看來(lái)好像是類型的問(wèn)題了,那我們將循環(huán)條件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;
- }
輸出的結(jié)果是
結(jié)果正是我們想要的。沒(méi)有進(jìn)行強(qiáng)制類型轉(zhuǎn)換,也沒(méi)有進(jìn)行二次賦值,只是將循環(huán)條件d的初始值定義在了無(wú)符號(hào)整形(unsigned int)的范圍之內(nèi)。
我們?cè)僮鰝€(gè)小測(cè)試
- 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;
- }
從代碼看來(lái),應(yīng)該是輸出“先有雞”。不過(guò)這次結(jié)果又是事與愿違,輸出的是“先有蛋”。
所以建議在寫(xiě)代碼的時(shí)候盡量避免使用無(wú)符號(hào)類型,同時(shí)也盡量避免有符號(hào)類型和相應(yīng)的無(wú)符號(hào)類型進(jìn)行比較等。
================================================================
本人才疏學(xué)淺和其他原因,沒(méi)有進(jìn)行更深入的研究,只是偶爾看到的IT面試題,感興趣簡(jiǎn)單的測(cè)了一下。
不過(guò)跟蹤監(jiān)視后,CX0017:錯(cuò)誤:沒(méi)有找到符號(hào)"TOTAL_ELEMENTS",還是沒(méi)有找到原因,有知道的大神不妨指點(diǎn)一二。。。。。。





























