有趣的IT面試題

一段看起來很簡單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類型的,結果就變成了:測試

IT面試題

。。。。。。。。。。這是咱們想要的結果,那就是說宏定義沒問題。spa

咱們在原來的main()函數中加一句blog

	int array_length = TOTAL_ELEMENTS;

這樣和類型強轉的效果應該是同樣的,跟蹤監視後獲得下面的結果:get

IT面試題

提示是沒有找到符號"TOTAL_ELEMENTS",可是array_length卻有值。。。。。。。很鬱悶it

接着,咱們在for循環裏處理數組長度io

	for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)

如今,輸出結果應該就是咱們想要的那個數組了。可結果呢,啥都沒輸出。。。。。。。更鬱悶for循環

那就繼續跟蹤監視

IT面試題

好像都沒問題,不過注意它們的類型,是無符號整形(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;
}

輸出的結果是

IT面試題

結果正是咱們想要的。沒有進行強制類型轉換,也沒有進行二次賦值,只是將循環條件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",仍是沒有找到緣由,有知道的大神不妨指點一二。。。。。。

相關文章
相關標籤/搜索