2011-03-18 63 views
2

已經持續通過這個代碼:爲什麼輸出結果不符合它的要求?

#include<cstdio> 

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {1,2,3,4,5,6,7}; 

int main() 
{ 
    signed int d; 
    printf("Total Elements in the array are => %d\n",TOTAL_ELEMENTS); 
    for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) 
     printf("%d\n",array[d+1]); 
    return 0; 
} 

現在很明顯,它不進入for循環。 是什麼原因?

+2

程序做了什麼**? – templatetypedef 2011-03-18 19:32:23

+2

測試你的技能。 – Sadique 2011-03-18 19:38:36

+1

@Acme:我寧願讓我的技能在不太難看的節目中測試。 :) – GManNickG 2011-03-18 19:43:52

回答

15

原因是,在C++中,你會得到一個隱含的提升。即使d被聲明爲有符號,但當您將其與(TOTAL_ELEMENTS-2)(由於sizeof而未簽名)進行比較時,d會被提升爲無符號。 C++具有非常具體的規則,基本上聲明d的無符號值將是一致的無符號值mod numeric_limits<unsigned>::max()。在這種情況下,會出現最大可能的無符號數,這個數明顯大於比較另一側數組的大小。

請注意,像g ++(帶-Wall)的編譯器可以被告知警告這樣的比較,所以您可以確保代碼在編譯時看起來正確。

+4

另外,每半個體面的編譯器都會警告你,它是一個完美的例子,在這個例子中,忽略警告能夠幫助你。 – pmr 2011-03-18 19:40:48

+0

+1爲更快:) – MByD 2011-03-18 19:43:03

+0

爲什麼只有C++?而不是C? http://www.ideone.com/JzkCv – Sadique 2011-03-18 19:51:50

-3

該程序看起來應該會引發編譯錯誤。你甚至在定義之前使用「數組」。切換前兩行,應該沒問題。

+2

預處理器是文本替換。在被替換的地方,定義了「數組」。 – GManNickG 2011-03-18 19:37:08

+0

數組用於定義。在所有地方TOTAL_ELEMENTS被擴展後,它將被定義。 – pmr 2011-03-18 19:37:11

+0

TOTAL_ELEMENTS在第一行沒有被使用,它被定義。 – 2011-03-18 19:37:18

相關問題