2010-02-24 103 views
1

這實際上從現在開始糾纏我。問題是這樣的:如何將程序的退出狀態設置爲任何值而不顯式使用gcc/g ++? 讓我們看看這段代碼:(從標準輸入並打印 需要輸入到標準輸出,直到零輸入0遇到)任何退出狀態,沒有明確使用返回/退出

#include <stdio.h> 

int main() { 
    int n; 
    while(scanf("%d",&n) && n>0) 
    printf("%d\n",n); 
} 

在我的系統(這是窗口+ MinGW的)它正在返回1,如何使 返回0或其他隱式地顯式使用 退出/返回?

編輯:

我修改一下代碼:

int f(int n) { 
    return (n>0); 
} 

int main(){ 
    int n; 
    while(scanf("%d",&n)&&f(n)) 
    printf("%d\n",n); 
} 

它現在返回0,含蓄,但我不能汲取今次任何明確的結論。

+1

你忘了提及編譯器和運行時環境。編譯器:gcc,運行時環境:http://spoj.pl – sambowry 2010-02-24 08:12:36

+0

從代碼中刪除「&& n> 0」後返回的代碼是什麼? – sambowry 2010-02-24 08:52:29

+4

你爲什麼想這樣做?我認爲這將是一個有用的編輯。 – JXG 2010-02-24 08:52:37

回答

0

問題是您的程序最終會終止 - 例如,運行時將在Windows上調用ExitProcess()或在另一個OS上調用等效函數。用於結束程序的原語將設置錯誤代碼(退出狀態),它將覆蓋您之前由您直接設置的代碼。

也許有一些C++運行時實現允許你想要的東西,但總的來說,行爲就像我上面所描述的那樣。

2

在C++和C99中,在不執行exit()或return的情況下離開main應該等價於返回0(請參閱5.1.2.2.3 for C,3.6.1/5 for C++),如果I正確回憶。

+0

是的,我意識到這一點,但仍然有一些GCC版本對於像我上面展示的程序那樣的一些程序表現得很奇怪, – 2010-02-24 10:00:14

+0

Undefined未定義...由於gcc對C99的支持仍然不完整,因此您可能在添加功能之前和之後測試了版本。 我不會驚訝的是,主要的結果是最後一個被調用的函數的結果,如果你以後不做太多的事情。這似乎解釋了您在編輯中觀察到的行爲。 – AProgrammer 2010-02-24 12:08:09

2

我認爲你的實現是使用main()內部調用的最後一個函數的返回值 - 當然,這不是你可以依賴的行爲。

(可能與編譯選項,即內聯更改)(這可能是由於留在EAX寄存器中的值,正如在評論中被提及。)

我能拿出最好的:

static int program_exit_value; 

void setExitValue(int value) 
{ 
    program_exit_value = value; 
} 

int main(void) 
{ 
    ... 

    return program_exit_value; 
} 

它使用return語句,但具有符合ANSI標準的優點。