2010-02-24 104 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标准的优点。