文档是:
在 C 语言中,"main"函数的处理方式与每个函数相同,它具有返回类型(在某些情况下通过参数接受输入)。唯一的区别是,当用户运行程序时,主函数由操作系统"调用"。因此,main 函数始终是程序启动时执行的第一个代码。
但是当我跑步时
int main() {
printf("%d", square(3));
return 0;
}
int square(int n) {
int sq = n * n;
return sq;
}
程序打印 9。 那么main() 函数是只在所有其他函数之后执行,还是以不同的方式特殊?
顺序是这样的:
- 操作系统调用
main()
main()
打电话给square(3)
.square(3)
计算结果9
并返回它。main()
呼叫printf("%d", 9)
printf()
在终端上打印9
并返回打印的字符数 (1)。main()
向操作系统返回 0。
被定义和被调用是有区别的。
main()
是运行时直接调用的一个函数来执行程序。其他一些可能会在全局变量或其他一些特殊情况下的初始值设定项中调用,但让我们忽略这些,特别是因为它们与您的情况无关。
所有其他人都直接或间接地从那里被召唤。或者它们只是死代码。
自 C99 以来,main()
还有另一个区别:return 0;
是隐含的。
顺便说一句,提高警告级别,所有在/未声明之前调用的函数都是错误。
此代码
int main() {
printf("%d", square(3));
return 0;
}
int square(int n) {
int sq = n * n;
return sq;
}
依赖于隐式函数声明的过时特性,因为在main
中使用之前没有名称square
的声明。 此功能在 1999 年修订版中从 C 标准中删除。 为了向后兼容,所有最常用的 C 编译器仍然尊重它(带有警告),但实际上使用它是一种糟糕的风格,可以隐藏错误。 您应该使用上述square
的显式"前向声明"编写此程序main
:
int square(int n);
int main(void)
{
/* remainder of program as you have it */
(在函数声明或定义的参数括号之间根本不放置任何东西也是一个过时的功能。要声明或定义一个不带参数的函数,你必须说(void)
.)
(在 C 中,出于历史原因,首选样式是将函数定义的左大括号放在自己的行上,即使所有其他左大括号都与if
、for
等"拥抱"在同一行上)
话虽如此,执行函数平方是因为,主要,它被称为:
int main() {
printf("%d", square(3));
^^^^^^
return 0;
}
也就是说,首先main
获得控制权,然后在内部调用square
main
函数。 如果main
没有调用square
,或者调用调用它的函数,square
永远不会被执行。
函数main
与任何其他函数之间的区别在于,在主机环境中,函数main
包含程序的入口点,即它首先获得控制权。函数main
可以在没有 return 语句的情况下定义,尽管它的返回类型是int
。
我大体上已经想到了这个问题。 我的出发点是"我应该在哪里处理动态分配,即 malloc? 在主函数还是库函数中?
我最后发现,如果我们不区分主要功能和其他功能,那么这不是一个问题。因此,是否划分为单独的功能取决于程序员的口味。
但是,通过无malloc的东西的例子来谈论main与其他函数之间的差异,我们在函数中分配内存,但我们在main中释放它。这当然是显而易见的!如果我们在返回之前在函数中使用 free,我们返回的内容是正确的!
main()
函数与 C 中的其他函数相比如何?
说main
"与每个功能一样对待"有些不完整。main
函数与C 中的任何其他函数非常相似,但它确实有一个关键区别和两个关键区别。
区别:main
的特殊之处在于它是入口点:执行环境自动调用的一个函数,用于启动和运行程序。
区别#1:与C中的所有其他函数不同,main
有两个签名。 它可以是int main(void)
的(即不接受任何参数),也可以是int main (int, char **)
.
区别#2:如果你编写一个没有return
语句的main
函数,它的编译就像你在最后写了return 0;
一样。
相比之下,普通函数必须只有一个签名,该签名由函数定义、所有函数声明和所有调用方一劳永逸地达成一致。 在普通函数中,如果它被声明为返回除void
以外的任何内容,并且如果控制流在没有显式return
语句的情况下"从末尾掉下来",那么您将进入未定义的行为领域。