为什么你会在C中的main()函数之前使用数据类型?

Why would you precede the main() function in C with a data type?

本问题已经有最佳答案,请猛点这里访问。

许多人都熟悉C语言中的Hello World程序:

1
2
3
4
5
6
7
#include <stdio.h>

main ()
{
    printf ("hello world");
    return 0;
}

为什么在intmain()函数之前有一些函数,如:

1
int main()

此外,我还看到在()中输入的单词void如下:

1
int main(void)

这看起来像是免费的额外输入,但也许这是在其他情况下支付红利的最佳实践?

另外,如果返回字符串,为什么在main()前面加一个int?如果有的话,人们会期望:

1
char main(void)

我也不明白为什么在函数结束时返回0。


main函数时返回的状态代码的整数,tells在操作系统中的程序是否exited successfully。。。。。。。 return 0indicates成功;回归的任何其他值indicates的故障。 </P >

由于这是不是一个整数和字符串,它int时返回,而不是charchar*。。。。。。。(电话printf并不需要做的任何事情都与从回归函数) </P >

older版本C allow a默认的返回类型int。。。。。。。 然而,它的更好的explicitly指定的返回类型。 </P >

在C(像C + +)的一个函数,不带任何参数,T是declared AS int myFunc(void) </P >


以下内容在C89中有效

1
2
3
main() {
  return 0;
}

但是在现代C(C99)中,这是不允许的,因为您需要显式地告诉变量的类型和函数的返回类型,所以它变成了

1
2
3
int main() {
  return 0;
}

另外,在现代C语言中省略return 0是合法的,因此写作是合法的。

1
2
3
int main() {

}

行为就好像它返回了0。

人们把void放在括号之间,因为它可以确保对函数调用进行正确的类型检查。C中的一组空括号意味着在函数之外没有关于参数数量和类型的信息被公开,调用方必须确切知道这些信息。

1
2
3
4
5
6
void f();
 /* defined as  void f(int a) { } later in a different unit */

int main() {
  f("foo");
}

f的调用会导致未定义的行为,因为编译器无法根据f在其他模块中的预期来验证参数的类型。如果用voidint编写,编译器就会知道

1
2
3
4
5
void f(int); /* only int arguments accepted! */

int main(void) {
  f("foo"); /* 'char*' isn't 'int'! */
}

因此,对于main来说,把void放在那里只是一个好习惯,因为在其他地方这样做很好。在C语言中,您可以递归地调用main,在这种情况下,这种差异甚至可能很重要。

遗憾的是,只有少数编译器支持现代C,所以对于许多C编译器,您可能仍然会收到使用现代C特性的警告。

此外,您还可以看到声明main的程序返回与int不同的内容。如果这些程序使用独立的C实现,就可以做到这一点。这种C实现不会对main施加任何限制,因为它们一开始甚至不知道或不需要这样的功能。但是,为了有一个到程序入口点的通用和可移植的接口,C规范要求严格符合的程序声明main,返回类型为int,并要求托管C实现接受这些程序。


它的被称为安境的现状。当程序finishes,你想让你的程序被调用方知道"exited。。。。。。。如果它exited normally,你将返回0,等。 </P >

这里的S *,你可以学习更多关于statuses境。 </P >


Why do some precede the main () function with int as in:

在C语言中(无论如何,这是您似乎要引用的代码),函数在前面没有任何数据类型时默认返回int。在它与int一起之前,最终只是一个偏好问题。

Also, I've seen the word 'void' entered inside the () as in:

这也是一个主要的偏好问题,但是这两个问题截然不同:

f(void)表示函数f接受zero参数,f()表示函数f接受an unspecified number of arguments参数。

f(void)是声明在c中不带参数的函数的正确方法。

It seems like extra typing for nothing, but maybe it's a best practice that pays dividends in other situations?

好处是清晰明了。如果你想说少输入是好的,那么你认为如何命名你所有的函数、变量、文件以及所有尽可能少的字符?

Also, why precede main() with an int if you're returning a character string? If anything, one would expect:

char main(void)

什么?为什么要从main返回字符串?完全没有理由这样做…

另外,您的main声明返回的是一个字符,而不是字符串。

I'm also foggy about why we return 0 at the end of the function.

程序结束时返回一个值给操作系统。这个值可以用来通知操作系统某些事情。例如,如果发现病毒,您的病毒扫描程序可以返回1,如果没有发现病毒,则返回0,如果发生错误,则返回2。通常,0意味着没有错误,一切都很顺利。


这是背后的推理提供了一些形态的错误报告机制。所以只要一个程序时返回的值是零,typically均值,它认为它successfully完成其任务。用于非零的值,在程序设计的一些失败的原因。然后每一个现在,这可能correspond number的某些错误的信息。 几种系统API调用中返回返回到C代码表明是否处理是成功的。一天,有一个好的理念,除在C,这是最好的方式来告诉你的是,如果调用成功的或不。 </P >


这是传统的使用,因为int main(int argc, char * argv[])返回整数可以表明如何在程序executed。。。。。。。回归A 0 indicates那的程序executed successfully,而A 1,这表明它有一个失败的some sort of。通常,境中的代码将是非常特异性和将是用来作为一种方法debugging由于exceptions(在C + +侦听)不存在在C。 </P >


"国际"之前,对申报的是主函数的返回类型的函数。这是,该函数时返回的整数。 </P >

从函数,你可以返回一个工件的数据。这是典型的返回的"0",如果successfully函数完成。任何其他号码,到255是returned程序,如果做不到successfully execute,节目中的错误,这发生。 </P >

这是,你的回报率为0,与int数据类型的节目,这对程序的executed correctly。。。。。。。 </P >


大多数的操作系统使用的退出代码的应用。typically,0是境规程(AS中的成功应用,successfully完成)。返回的值是什么main()变得returned的操作系统,这就是为什么main()通常时返回的整数(从硬件和0是成功的,大多数的C程序,将有一个return 0;在端)。 </P >