首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么main在这里不返回0?

为什么main在这里不返回0?
EN

Stack Overflow用户
提问于 2011-12-30 16:40:15
回答 3查看 4.8K关注 0票数 116

我只是在看书

ISO/ 9899:201x委员会草案-2011年4月12日

其中我在5.1.2.2.3程序终止下找到

代码语言:javascript
复制
..reaching the } that terminates the main function returns a value of 0. 

这意味着如果你没有在main()中指定任何返回语句,如果程序成功运行,那么在main的右大括号}处将返回0。

但是在下面的代码中,我没有指定任何return语句,但它也没有返回0

代码语言:javascript
复制
#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}

int main()
{
    int a=10;
    int b=5;
    int ans;    
    ans=sum(a,b);
    printf("sum is %d",ans);
}

编译

代码语言:javascript
复制
gcc test.c  
./a.out
sum is 15
echo $?
9          // here it should be 0 but it shows 9 why?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-30 16:43:16

该规则是在1999年版本的C标准中添加的。在C90中,返回的状态为undefined。

您可以通过将-std=c99传递给gcc来启用。

作为附注,有趣的是返回了9,因为它是printf的返回,它只写了9个字符。

票数 141
EN

Stack Overflow用户

发布于 2011-12-30 16:45:39

它返回printf的返回值,即实际打印的字符数。

票数 15
EN

Stack Overflow用户

发布于 2012-01-04 01:58:13

函数的返回值通常存储在cpu的eax寄存器中,因此语句"return 4;“通常编译为

代码语言:javascript
复制
mov eax, 4;
ret;

并且返回x(取决于您的编译器)将类似于:

代码语言:javascript
复制
mov eax, [ebp + 4];
ret;

如果你没有指定返回值,那么编译器仍然会输出"ret“,但不会改变eax的值。因此,调用者会认为eax寄存器中以前留下的是返回值。对于本例,它通常是返回值printf,但不同的编译器将生成不同的机器码,并以不同的方式使用某些寄存器。

这是一个简单的解释,不同的调用约定和目标平台将扮演重要的角色,但它应该是足够的信息来解释你的例子中“幕后”发生的事情。

如果你已经对汇编器有了基本的了解,那么比较不同编译器的反汇编是值得的。您可能会发现,某些编译器正在清除eax寄存器作为一种保护措施。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8677672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档