#include <stdio.h>
int main(void)
{
printf("Hello, World\n");
}
在上面的代码中(最初显示为picture),main
函数的返回类型为int
,但我们没有在该函数中返回任何值。
即使没有return语句,此函数也可以工作。
这怎么可能?
答案 0 :(得分:1)
答案 1 :(得分:1)
在C99和C11 §5.1.2.2.3 Program termination中,标准规定:
5.1.2.2.3程序终止
¶1如果
main
函数的返回类型是与int
兼容的类型,则返回 对main
函数的初始调用等同于使用值调用exit
函数 由main
函数返回作为其参数; 11)到达}
终止main
函数返回值0.如果返回类型与int
不兼容,则为。{ 返回到主机环境的终止状态未指定。11)根据6.2.4,在
main
中声明具有自动存储持续时间的对象的生命周期 将在前一种情况下结束,即使他们不会在后一种情况下。
C90中没有类似的规定。如果从C90程序中的main()
返回到最后(而不是通过执行带有值的return
),则返回到环境的值是未定义的。代码仍然有效,但shell等程序无法可靠地检测程序是否成功。
ISO / IEC 9899:1990
5.1.2.2.3程序终止
¶1从初始调用到
main
函数的返回等同于调用exit
函数 使用main
函数返回的值作为其参数。如果main
函数执行不指定值的返回,则返回到主机环境的终止状态是未定义的。6.6.6.4
return
语句¶3如果执行了没有表达式的return语句,并且调用者使用了函数调用的值,则行为是未定义的。到达终止函数的
}
等同于在没有表达式的情况下执行return
语句。
C11 §6.8.6.4 The return
statement中没有此段落。
因此,如果您的编译器支持C99或C11,则删除main()
的末尾等同于return 0;
,但在C99之前不是这种情况。我认为这与完全符合C ++ 98(基本上具有相同的规则)以及任何其他原因一样。
就个人而言,我不喜欢该规则,我的main()
计划通常会以return 0;
结束。
答案 2 :(得分:-1)
这是为了使代码与C的早期阶段兼容。
C编译器隐式为你做了。 :) 即
return 0;