14

许多人都熟悉 C 语言中的 hello world 程序:

#include <stdio.h>

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

为什么有些在main()函数前面加上int如下:

int main()

另外,我已经看到在as 中void输入的单词:()

int main(void)

这似乎是无用的额外输入,但也许这是在其他情况下支付红利的最佳实践?

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

char main(void)

我也对为什么我们在函数末尾返回 0 感到困惑。

4

8 回答 8

14

main函数返回一个整数状态码,告诉操作系统程序是否成功退出。
return 0表示成功;返回任何其他值表示失败。

因为这是一个整数而不是字符串,所以它返回int, 不是charor char*。(调用printf与从函数返回没有任何关系)

旧版本的 C 允许默认返回类型为int.
但是,最好明确指定返回类型。

在 C(与 C++ 不同)中,不带任何参数的函数被声明为int myFunc(void)

于 2010-05-23T17:57:57.143 回答
12

以下已在 C89 中有效

main() {
  return 0;
}

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

int main() {
  return 0;
}

此外,在现代 C 中省略 thereturn 0是合法的,所以写成是合法的

int main() {

}

行为就好像它返回了 0。

人们放在void括号之间是因为它确保对函数调用进行正确的类型检查。C 中的一组空括号意味着没有关于参数的数量和类型的信息暴露在函数之外,调用者必须准确地知道这些。

void f();
 /* defined as  void f(int a) { } later in a different unit */

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

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

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 实现接受这样的程序。

于 2010-05-23T18:05:54.257 回答
5

这称为退出状态。当程序结束时,你想让被调用者知道你的程序是如何退出的。如果它正常退出,你会返回0,等等。

您可以在此处了解有关退出状态的更多信息。

于 2010-05-23T17:57:57.740 回答
3

为什么有些在 main () 函数之前带有 int,如下所示:

在 C 中(无论如何,这就是您所指的 C 89),当函数int前面没有任何数据类型时,函数默认返回。在它之前使用int最终只是一个偏好问题。

另外,我看到在 () 中输入了“void”这个词,如下所示:

这也是一个偏好问题,但是这两个是完全不同的

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

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

这似乎是无用的额外输入,但也许这是在其他情况下支付红利的最佳实践?

好处是清晰。如果您要争辩说少打字是好的,那么您如何看待用尽可能少的字符命名所有函数、变量和文件以及所有内容?

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

字符主要(无效)

什么?为什么你会从 中返回一个字符串main?绝对没有理由这样做...

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

我也对为什么我们在函数末尾返回 0 感到困惑。

程序结束时向操作系统返回一个值。该值可用于通知操作系统某些事情。例如,1如果发现0病毒、未发现病毒以及2发生错误,您的病毒扫描程序可能会返回。通常,0意味着没有错误,一切顺利。

于 2010-05-23T18:07:20.647 回答
2

这背后的原因是提供某种形式的错误报告机制。因此,每当程序返回零值时,这通常意味着它认为它成功完成了任务。对于非零值,程序由于某种原因失败。有时,该数字可能对应于某个错误消息。C 中的几个系统 API 调用返回返回代码以指示处理是否成功。由于 C 中没有异常的概念,因此这是判断调用是否成功的最佳方法。

于 2010-05-23T18:00:08.403 回答
1

大多数操作系统对应用程序使用退出代码。通常,0是成功的退出代码(如应用程序成功完成)。的返回值main()是返回给操作系统的值,这就是为什么main()通常返回一个整数(因为0成功,大多数 C 程序return 0;最后都会有一个)。

于 2010-05-23T17:58:19.873 回答
1

主函数声明前的“int”是函数的返回类型。也就是说,该函数返回一个整数。

从函数中,您可以返回一条数据。如果函数成功完成,通常返回“0”。如果程序未成功执行,则返回任何其他数字(最多 255)以显示发生的错误。

也就是说,您返回 0,具有 int 数据类型,以表明程序正确执行。

于 2010-05-23T18:00:24.330 回答
1

使用它是传统的,int main(int argc, char * argv[])因为整数返回可以指示程序如何执行。返回 0 表示程序执行成功,而 -1 表示它有某种失败。通常,退出代码将非常具体,并且将用作调试方法,因为 C 中不存在异常(在 C++ 意义上)。

于 2010-05-23T18:00:49.820 回答