C中的int main()和int main(void)之间有真正的区别吗

  • 本文关键字:main int 区别 void 中的 之间 c
  • 更新时间 :
  • 英文 :


前言:

这可能会被标记为重复,我理解,但我问这个问题,因为我觉得其他答案可能不太清楚。事实上,我发现对我来说最有意义的最接近的答案是这个:从2015年开始,这个:从2013年开始,关于return 0;

我几乎没有编程经验——几年前我在Java上搞砸了,我想好了需要复制和粘贴什么来编辑我正在玩的程序,我用python写了一个简单的程序,在学校里我也玩过Scratch。但是,我终于决定坐下来,学习一门C语言,然后继续学习

所以,我想问的是,我对这个问题的解释是正确的吗?因为,如果是这样的话,那么就大多数意图和目的而言,在没有自变量的int main()int main(void)之间没有区别。

实际重要性:

总结我目前的理解:

  1. 如果使用int main(),则应在末尾添加return 0;,以表示程序终止
  2. 虽然可能,但使用int main()而不使用return 0;是不合适的,因为许多编译器可能无法识别这一点
  3. 如果使用int main(void),则不需要添加return 0;

用通俗的英语来说,这会是一个好的和/或准确的解释吗?

示例:

/*
* Program example using scanf, printf, and int main() with no variable
* This program reads a string from the user
*/
#include <stdio.h>
int main() {
char name[10];                /* number in square brackets is for max characters in name */
printf("Enter name: ");
scanf("%s", name);            /* scanf will read input until it sees blank space, then stop */
printf("Hello, %s!n", name);
return 0;
}

与。

/*
* Program example using scanf, printf, and int main(void)
* This program reads a string from the user
*/
#include <stdio.h>
int main(void) {
char name[10];                /* number in square brackets is for max characters in name */
printf("Enter name: ");
scanf("%s", name);            /* scanf will read input until it sees blank space, then stop */
printf("Hello, %s!n", name);
}

如果使用int main(),则应在末尾添加return 0;,以表示程序终止。

大部分为真。这是一种很好的做法,尽管并非绝对必要,正如我们将看到的那样。

尽管可能,但使用int main()而不使用return 0;是不合适的,因为许多编译器可能无法识别这一点。

大部分为false。一段时间以来,作为名为main()的函数特有的特殊情况,如果不提供返回语句,编译器需要安排main隐式返回0。

旧的编译器可能仍然需要return 0;,如果省略它,则会表现得很糟糕——尽管故障通常很小。此外,一个旧到不符合此要求的编译器肯定会有许多其他更重要的兼容性问题需要担心。

如果使用intmain(void),则无需添加return 0;

正确,但具有误导性。CCD_ 19和CCD_。同样正确的是(根据以上内容(,如果使用int main(),则不必添加return 0

区别在于int main()没有为main指定原型化声明。作为函数的定义,两者是等价的,并以相互兼容的方式定义函数。然而,int main()在作用域中引入了较少的编译时信息。

在C中(与C++不同(,允许main递归。因此,我们可以考虑以下愚蠢的程序:

int main(void)
{
main(42);
}

因为main是完全声明的,所以main(42)调用是违反约束的,需要进行诊断。如果我们将程序更改为:

int main()
{
main(42);
}

那么函数并没有改变:它仍然是一个不需要参数的函数。但该信息并没有声明为main标识符的类型信息的一部分,因此该调用不需要诊断。(如果翻译并执行,它会调用未定义的行为;但即使有诊断,也可能发生这种情况。(

这是一种古老的风格,在C有函数原型声明之前,函数原型声明在1989年的ANSI C中首次标准化,并在此之前广泛使用。

最新的标准允许您提交return 0语句。关于main()的原型,有3种相同的变体:

int main()
int main(void)
int main(int argc, char* argv[])

C中的空参数列表意味着您可以传递任意数量的参数,但函数不会关心其中的任何一个。指定void参数列表意味着您必须明确传递no参数,否则将出现错误。

虽然标准只明确接受版本#2和#3,但版本#1也能工作,因为操作系统传递了版本#3的参数,而您的函数不会关心它们。

希望我的回答足够清楚。

相关内容

最新更新