我只是在看书
ISO/ 9899:201x委员会草案-2011年4月12日
其中我在5.1.2.2.3程序终止下找到
..reaching the } that terminates the main function returns a value of 0.
这意味着如果你没有在main()
中指定任何返回语句,如果程序成功运行,那么在main的右大括号}处将返回0。
但是在下面的代码中,我没有指定任何return语句,但它也没有返回0
#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);
}
编译
gcc test.c
./a.out
sum is 15
echo $?
9 // here it should be 0 but it shows 9 why?
发布于 2011-12-30 16:43:16
该规则是在1999年版本的C标准中添加的。在C90中,返回的状态为undefined。
您可以通过将-std=c99
传递给gcc来启用。
作为附注,有趣的是返回了9,因为它是printf
的返回,它只写了9个字符。
发布于 2011-12-30 16:45:39
它返回printf
的返回值,即实际打印的字符数。
发布于 2012-01-04 01:58:13
函数的返回值通常存储在cpu的eax寄存器中,因此语句"return 4;“通常编译为
mov eax, 4;
ret;
并且返回x(取决于您的编译器)将类似于:
mov eax, [ebp + 4];
ret;
如果你没有指定返回值,那么编译器仍然会输出"ret“,但不会改变eax的值。因此,调用者会认为eax寄存器中以前留下的是返回值。对于本例,它通常是返回值printf,但不同的编译器将生成不同的机器码,并以不同的方式使用某些寄存器。
这是一个简单的解释,不同的调用约定和目标平台将扮演重要的角色,但它应该是足够的信息来解释你的例子中“幕后”发生的事情。
如果你已经对汇编器有了基本的了解,那么比较不同编译器的反汇编是值得的。您可能会发现,某些编译器正在清除eax寄存器作为一种保护措施。
https://stackoverflow.com/questions/8677672
复制相似问题