将 return 0 与 void main() 一起使用?
Using return 0 with void main()?
我只是想看看如果我将 return 0
语句与 void main()
一起使用会发生什么。我原以为编译器会给出一个错误,但它只是给出了一个警告并成功执行了程序,但最后,returned 了一些非零值,现在我怀疑为什么程序没有错误地执行然后也return 当我使用 void main()
?
时有些值
#include<stdio.h>
void main()
{
printf("Hello World\n");
return 0;
}
main的这个return值通常被程序运行所在的操作系统用来判断执行过程中是否有错误,通常值为0表示成功,其他值被解释为错误按照惯例。
i have doubt why the program executes without a error and then also return some value when i have used void main()
C 标准规定,正确的做法是 int main
,并且允许符合规范的实现在 main
上允许其他签名(如果它愿意的话)。
显然您的实现选择允许这种非标准用法,并且它表现出的行为是编译时的警告,然后是运行时观察到的行为。
但你已经知道了。编译器做编译器做的事,因为编译器作者是那样写的。如果你想知道他们为什么做出这些选择,问问他们。由于你没有说你用的是什么编译器,我们就没什么好说的了。
您的代码不是有效的 C 代码。 C 语言不允许您在 void
函数中使用 return 0
。这是约束违规,即我们通俗地称之为错误。每个符合标准的 C 编译器都需要为此代码发出诊断消息,之后从标准 C 语言的角度来看,您的代码的行为是未定义的。
根据您的描述,您的编译器确实按照语言规范的要求为此代码发出了诊断消息。之后,您从编译代码中观察到的任何行为可能(或可能不)由您的特定编译器定义,但不再由语言本身定义。
在 returns void
的函数中使用 return 0;
是 约束违规:
6.8.6.4 The return statement
Constraints
1 A return
statement with an expression shall not appear in a function whose return type
is void
. A return
statement without an expression shall only appear in a function
whose return type is void
.
编译器必须发出约束违规诊断(您在编译期间看到的警告)- 但是,编译器可能继续翻译程序并生成可执行文件(警告和错误之间的区别,以及是否停止翻译,取决于实现)。
其次,除非您的编译器文档 明确 将 void
列为 main
的有效 return 类型,使用 void main
导致未定义的行为 - 此时,编译器不需要以任何特定方式处理这种情况。
通常,试图找出如何从未定义的行为中得到特定的结果是浪费时间,因为行为可能不可重复。在这种情况下,您告诉编译器 main
不会 return 一个值,它会相应地生成机器代码。用于该 return 值的寄存器很可能在 main
return 编辑后立即被覆盖。
我只是想看看如果我将 return 0
语句与 void main()
一起使用会发生什么。我原以为编译器会给出一个错误,但它只是给出了一个警告并成功执行了程序,但最后,returned 了一些非零值,现在我怀疑为什么程序没有错误地执行然后也return 当我使用 void main()
?
#include<stdio.h>
void main()
{
printf("Hello World\n");
return 0;
}
main的这个return值通常被程序运行所在的操作系统用来判断执行过程中是否有错误,通常值为0表示成功,其他值被解释为错误按照惯例。
i have doubt why the program executes without a error and then also return some value when i have used void main()
C 标准规定,正确的做法是 int main
,并且允许符合规范的实现在 main
上允许其他签名(如果它愿意的话)。
显然您的实现选择允许这种非标准用法,并且它表现出的行为是编译时的警告,然后是运行时观察到的行为。
但你已经知道了。编译器做编译器做的事,因为编译器作者是那样写的。如果你想知道他们为什么做出这些选择,问问他们。由于你没有说你用的是什么编译器,我们就没什么好说的了。
您的代码不是有效的 C 代码。 C 语言不允许您在 void
函数中使用 return 0
。这是约束违规,即我们通俗地称之为错误。每个符合标准的 C 编译器都需要为此代码发出诊断消息,之后从标准 C 语言的角度来看,您的代码的行为是未定义的。
根据您的描述,您的编译器确实按照语言规范的要求为此代码发出了诊断消息。之后,您从编译代码中观察到的任何行为可能(或可能不)由您的特定编译器定义,但不再由语言本身定义。
在 returns void
的函数中使用 return 0;
是 约束违规:
6.8.6.4 The return statement
Constraints
1 Areturn
statement with an expression shall not appear in a function whose return type isvoid
. Areturn
statement without an expression shall only appear in a function whose return type isvoid
.
编译器必须发出约束违规诊断(您在编译期间看到的警告)- 但是,编译器可能继续翻译程序并生成可执行文件(警告和错误之间的区别,以及是否停止翻译,取决于实现)。
其次,除非您的编译器文档 明确 将 void
列为 main
的有效 return 类型,使用 void main
导致未定义的行为 - 此时,编译器不需要以任何特定方式处理这种情况。
通常,试图找出如何从未定义的行为中得到特定的结果是浪费时间,因为行为可能不可重复。在这种情况下,您告诉编译器 main
不会 return 一个值,它会相应地生成机器代码。用于该 return 值的寄存器很可能在 main
return 编辑后立即被覆盖。