2013-08-27 48 views
0

我無法理解以下C程序的輸出,有什麼想法嗎?這一計劃的無法理解以下C語言程序的輸出

#include<stdio.h> 

#include<conio.h> 

void main() 

{ 
    int a=5,b=6,c=11; 

    clrscr(); 

    printf("%d %d %d"); 

    getch(); 
} 

輸出是:

我不明白爲什麼上面的程序給我們的printf我從未宣佈過反向的變量值,其值必須打印...所以有什麼理論,如果我們沒有宣佈哪個變量必須打印,那麼我們得到的變量的數據類型的上面聲明的反向值...

+10

看起來像我未定義的行爲,換句話說,純粹的運氣,它打印甚至遠程相關的東西。 –

+1

這是未定義的行爲,我確定在某處存在重複。 –

+0

使用另一個編譯器試一下,你會得到隨機結果(例如clang或gcc) – Geoffroy

回答

13

這是undefined behavior,你不應該指望一個特定的輸出(或其解釋),除非你關心實現的具體細節。

可能打印的是某些堆棧位置或寄存器中包含的(隨機;即「不可預知的」)垃圾值,該堆棧位置或寄存器應該保存參數。

順便說一句,一些編譯器(即GCC當調用gcc -Wall時)會給你一些警告。儘量避免它們(通過糾正源代碼)。

+0

當涉及到C或者有一個列表時,是否有很多事情屬於未定義行爲的範圍? – Sid

+5

我認爲理解C的定義行爲(和語義)比試圖列舉所有未定義行爲的可能情況更重要。 –

0

上述程序的輸出取決於編譯器。因爲它是未定義的行爲。

Turbo C會給你預期的輸出。在做printf之前嘗試做一些操作。你不會得到你所期望的輸出。因爲printf將打印最近的stack條目。

如果使用gcc under linux編譯相同的程序,您將收到警告。

+0

使用'gcc',至少在編譯'gcc -Wall'時會在* compile *時間(不是在運行時建議) –

+0

已更新gcc編譯器在編譯時本身發出警告。我正在使用gcc版本4.6.1(Ubuntu/Linaro 4.6.1-9ubuntu3) – sujin

+0

然後請說「如果你在Linux下使用'gcc'編譯相同的程序」 –

4

printf使用堆棧來存儲和稍後打印數據。在這種情況下,第一一個進去,然後B,然後ç。當printf的彈出元素,第一Ç出來然後b然後一個

2

有一個很好的解釋權here。 在運行時,程序只會打印堆棧中的內容,這恰好是您的變量。

2

供您參考

INT的printf(爲const char *格式,...);

... - 指定要打印的數據的參數。如果任何參數不是相應轉換說明符所期望的類型,或者存在較少格式的參數,則行爲是undefined。如果有比要求的格式更多的參數,外來參數進行評估,並忽略

正如Joachim說,你得到的答案是單純的luck.You無法預測確切的結果。