可能重复:
隐式返回 0
为什么返回 0 是可选的?
为什么 C 中的 main() 函数即使不使用exit
or也可以正确终止return
?
例如:
#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);
}
可能重复:
隐式返回 0
为什么返回 0 是可选的?
为什么 C 中的 main() 函数即使不使用exit
or也可以正确终止return
?
例如:
#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);
}
这是因为 C99 和 C11 标准是这样说的:
5.1.2.2.3 程序终止
到达
}
终止main
函数的返回值 0。如果返回类型与 不兼容int
,则返回到宿主环境的终止状态未指定。
但是,您应该添加一个 return 语句。这是因为返回的值在 C89 中是未定义的,否则!
3.6.6.4 返回语句
到达
}
终止函数的方法等同于在没有表达式的情况下执行 return 语句。2.1.2.2 托管环境
如果主函数执行一个没有指定值的返回,返回给宿主环境的终止状态是未定义的。
因为编译器exit
为你添加了一个隐式。
检查 nightcracker 的原因;我仍然强烈建议您使用有意义的返回码进行显式退出/返回。
C99标准:
如果 main 函数的返回类型是与 int 兼容的类型,则从初始调用到 main 函数的 return 等价于以 main 函数返回的值作为参数调用 exit 函数;10)到达 }终止 main 函数返回值 0。如果返回类型与 int 不兼容,则返回给宿主环境的终止状态未指定。
我正在寻找要检查的 C89 文本。
因为编译器会为您添加它。
在 unix/linux 上你可以试试这个小脚本:
retval.sh
#!/bin/sh
$1
echo $?
然后通过它运行你的程序:
./retval.sh yourprogram
它将输出程序的返回值。即使您不添加任何返回,您也会看到 main() 或 exit() 将返回一个整数值。
因为如果执行终止而没有任何一个它假定它是成功的,即返回 0。
主要的是,如果您不使用标志,您的编译器将不会告诉您任何信息。
如果你使用严重的标志,你的编译器会告诉你每一个缺失的细节。
返回一些东西很重要,启动你的程序可以被告知你的程序是否执行成功。如果您的程序不返回任何内容(默认为 0),例如,您启动它的终端将假定它即使失败也能正常运行。