如果我在return 0
中使用void main()
语句,我只是想看看会发生什么。我原以为编译器会给出一个错误,但是它只是给出一个警告并成功执行了程序,但是最后返回了一些非零值,现在我怀疑为什么程序执行时没有错误,然后在我返回时也返回一些值使用过void main()
吗?
#include<stdio.h>
void main()
{
printf("Hello World\n");
return 0;
}
答案 0 :(得分:3)
我怀疑为什么程序执行时没有错误,然后在我使用void main()时又返回了一些值
C标准指出,正确的做法是int main
,并且允许遵循的实现允许main
上的其他签名(如果愿意的话)。
显然,您的实现选择允许这种非标准用法,并且它表现出的行为是在编译时发出警告,然后在运行时观察到行为。
但是您已经知道了。编译器执行编译器的操作是因为编译器作者是用这种方式编写的。如果您想知道他们为什么做出这些选择,请询问他们。由于您尚未说明正在使用的编译器,因此我们无所事事。
答案 1 :(得分:3)
在返回return 0;
的函数中使用void
是约束违反:
6.8.6.4 return语句
约束
1带有表达式的return
语句不应出现在其返回类型的函数中 是void
。没有表达式的return
语句只能出现在函数中 其返回类型为void
。
编译器必须发出针对违反约束的诊断(您在编译过程中看到的警告)-但是,编译器可以继续翻译程序并生成可执行文件(警告和错误之间的区别以及是否停止翻译取决于实现。)
第二,除非您的编译器文档明确地将void
列为main
的有效返回类型,否则使用void main
会导致不确定的行为-那时,不需要编译器以任何特定方式处理这种情况。
通常,试图弄清如何通过未定义的行为获得特定结果是浪费时间,因为行为可能无法重复。在这种情况下,您告诉编译器main
不会返回值,而是相应地生成了机器代码。 main
返回后,用于该返回值的寄存器可能会被覆盖。
答案 2 :(得分:2)
您的代码不是有效的C代码。 C语言不允许您在return 0
函数中使用void
。这是违反约束,即我们俗称的错误。每个合格的C编译器都需要为此代码发出诊断消息,然后从标准C语言的角度来看,代码的行为是不确定的。
根据您的描述,您的编译器确实按照语言规范的要求对此代码发出了诊断消息。之后,您从编译代码中观察到的任何行为都可能(或可能不是)由您的特定编译器定义,但不再由语言本身定义。
答案 3 :(得分:1)
main的返回值通常用于程序运行所在的操作系统,以确定执行期间是否存在错误,通常,值0为成功,而其他值按惯例被解释为错误。