当我遇到C程序的return语句/退出语句时,我只是编写了一个快速程序来计算一些东西.
我声明main()是类型的int,所以我必须输入一个整数,否则我的程序将无法正确编译.但是,制作main一个Boolean甚至是否可以接受void?
我知道创建一个C程序的标准方法是返回一个值,这样可以解决任何问题,但不会以Boolean同样的方式工作吗?另外,我是否能够宣布它void并且在终止后仍然运行我的程序时操作系统没有问题?
感谢您的帮助.
C99标准说:(§5.1.2.2.1 程序启动)
程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用int的返回类型定义,并且没有参数:
Run Code Online (Sandbox Code Playgroud)int main(void) { /* ... */ }或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):
Run Code Online (Sandbox Code Playgroud)int main(int argc, char *argv[]) { /* ... */ }或同等学历; 或者以某种其他实现定义的方式.
因此,在托管环境中,int是唯一有效的标准返回类型.实现可以定义其他入口点.
请注意,第5.1.2.2.3节程序终止部分具有:
如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等效于调用exit函数,其中main函数返回的值作为其参数; 到达终止main函数的}返回值0.如果返回类型与int不兼容,则未指定返回到主机环境的终止状态.
因此main,只要您main返回一个,您在C99中省略退货是合法的int.
(但是之前版本的C标准没有例外main- 没有返回任何值(或者}没有返回语句到达final )会导致" 终止状态返回到主机环境[未定义.".)
摘要: 您不一定必须这样做,但如果您的代码可能是使用 C99 之前的编译器编译的,则应该这样做。
在C90中,到达结束main()而不执行return语句意味着“返回到主机环境的终止状态未定义”。在我使用过的至少一个系统上,返回的状态为 1,这在该系统上表明程序失败。
C99 添加了一条新规则,表示到达末尾main()返回 0。(C++ 有相同的规则。)并非所有编译器都完全实现 C99,并且默认情况下,那些实现了的编译器通常不会表现得符合 C99 编译器。(10年后补充:现在一致性情况更好了,大多数现代C编译器至少支持C99。)
唯一可以返回的可移植值main()是 0、EXIT_SUCCESS和EXIT_FAILURE(后两个在<stdlib.h>. 0 中定义,EXIT_SUCCESS表示程序成功(EXIT_SUCCESS通常定义为 0);EXIT_FAILURE表示程序失败。 return 1;很常见,但不可移植; 我曾在一个系统 (VMS) 上工作过,其中终止状态 1 表示成功。如果您希望程序可移植,请使用 来EXIT_FAILURE表示失败;这就是它的用途。某些系统和程序定义了其他特定于系统的或应用程序特定的状态代码。
为了可移植性(以及,恕我直言,风格),最好return 0;在 的末尾进行显式操作main(),尽管并非在所有情况下都需要这样做。添加一行代码(在最坏的情况下是无害的)比浪费时间确定是否需要它要容易得多。
(10 年后更新:我不再认为执行显式操作很重要return 0; ,除非您要求代码与旧编译器或配置为符合旧 C90 标准的当前编译器一起使用。)
请注意,正确的定义main()是:
int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
和
int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
或同等内容(例如,您可以编写char **argv而不是char *argv[])。是否有效值得怀疑int main() { /* ... */ },出于微妙的原因我不会在这里讨论,但我相信所有编译器都接受它。同样,添加void关键字比浪费时间确定是否需要它更容易。
很多书籍和教程都使用void main()或void main(void)。特定的编译器可能会选择允许这样做,但它不可移植。在书籍或教程中看到void main这是一个好兆头,表明作者不太了解 C 标准,您应该寻找其他东西来学习。