在void main()中使用return 0?

时间:2018-07-24 18:57:23

标签: c return void

如果我在return 0中使用void main()语句,我只是想看看会发生什么。我原以为编译器会给出一个错误,但是它只是给出一个警告并成功执行了程序,但是最后返回了一些非零值,现在我怀疑为什么程序执行时没有错误,然后在我返回时也返回一些值使用过void main()吗?

#include<stdio.h>

void main()
{
    printf("Hello World\n");
    return 0;
}

4 个答案:

答案 0 :(得分:3)

  

我怀疑为什么程序执行时没有错误,然后在我使用void main()时又返回了一些值

C标准指出,正确的做法是int main,并且允许遵循的实现允许main上的其他签名(如果愿意的话)。

显然,您的实现选择允许这种非标准用法,并且它表现出的行为是在编译时发出警告,然后在运行时观察到行为。

但是您已经知道了。编译器执行编译器的操作是因为编译器作者是用这种方式编写的。如果您想知道他们为什么做出这些选择,请询问他们。由于您尚未说明正在使用的编译器,因此我们无所事事。

答案 1 :(得分:3)

在返回return 0;的函数中使用void约束违反

6.8.6.4 return语句

约束

1带有表达式的return语句不应出现在其返回类型的函数中 是void。没有表达式的return语句只能出现在函数中 其返回类型为void

C 2011 online draft

编译器必须发出针对违反约束的诊断(您在编译过程中看到的警告)-但是,编译器可以继续翻译程序并生成可执行文件(警告和错误之间的区别以及是否停止翻译取决于实现。)

第二,除非您的编译器文档明确地void列为main的有效返回类型,否则使用void main会导致不确定的行为-那时,不需要编译器以任何特定方式处理这种情况。

通常,试图弄清如何通过未定义的行为获得特定结果是浪费时间,因为行为可能无法重复。在这种情况下,您告诉编译器main不会返回值,而是相应地生成了机器代码。 main返回后,用于该返回值的寄存器可能会被覆盖。

答案 2 :(得分:2)

您的代码不是有效的C代码。 C语言不允许您在return 0函数中使用void。这是违反约束,即我们俗称的错误。每个合格的C编译器都需要为此代码发出诊断消息,然后从标准C语言的角度来看,代码的行为是不确定的。

根据您的描述,您的编译器确实按照语言规范的要求对此代码发出了诊断消息。之后,您从编译代码中观察到的任何行为都可能(或可能不是)由您的特定编译器定义,但不再由语言本身定义。

答案 3 :(得分:1)

main的返回值通常用于程序运行所在的操作系统,以确定执行期间是否存在错误,通常,值0为成功,而其他值按惯例被解释为错误。