C main() 函数

对于 C 语言中的 main() 函数,我们再熟悉不过了,因为从第一个 C 程序开始,我们就已经接触过它了。这一节再来带小伙伴深入了解一下 main() 函数的技术细节。

C main() 函数简介

在 C 语言中,main() 函数也叫做 “主函数”。main() 函数是 C 程序的入口,也就是说一个 C 程序是从 main() 函数开始执行的。很多初学的小伙伴都会以为一个 C 程序是从 #include <stdio.h> 开始的,这样理解就是错误的了。

一个 C 程序无论多复杂,总体上都是 “一个函数”。只不过在这个函数内部,你可以调用其他子函数而已。是不是有点像嵌套函数呢?你说得没错,如果在 main() 内部调用其他函数,其实就是嵌套函数。

#include <stdio.h>

int main(void)      // 代码从这里执行
{
    ……
    return 0;
}

这里肯定有人问:“假如 C 程序是从 main() 内部执行,那么它外部定义的 #include <stdio.h> 有什么意义呢,这句代码又不会被执行啊。” 这样理解并不对。实际上,#include <stdio.h> 这句预处理指令的目的是为了在 main() 函数以及程序中的其他地方可以使用 <stdio.h> 头文件中声明的函数,例如 printf()、scanf() 等。

提示: 预处理器会在编译之前处理这些指令,将 <stdio.h> 文件的内容(通常是函数声明)包含到你的源代码中,使得编译器能够识别和正确处理这些函数调用。

main() 函数执行的时候,如果内部使用了 printf() 或 scanf(),那么它就会尝试读取头文件,然后才会去执行 #include <stdio.h>。如果内部没有使用到 printf() 或 scanf(),那么 #include <stdio.h> 这一句代码就不会被执行。

实际上,main() 函数可以放在一个 C 程序的任何地方。但是每次执行这个 C 程序时,编译器都会先找到它,然后从它开始执行。如果把一个 C 程序看成是一辆汽车,那么 main() 函数就相当于汽车的引擎,控制着汽车的所有运行。

main() 函数就相当于汽车的引擎

这里还存在一个问题,明明口口声声说 main() 是一个函数,但 main() 函数似乎只有 “函数定义” 部分,我也没见到 “函数调用” 部分呀。不是说函数只有在调用的时候才会去执行函数定义部分吗?大家别忘了,main() 是一个非常特殊的函数,它并不是一个普通的函数。对于 C 程序来说,它在运行时会自动调用 main(),而不需要我们手动去调用。

对于 C 语言中的 main() 函数,我们可以总结出以下几点。

  • 一个 C 程序必须要有一个 main() 函数,并且也只能有一个 main() 函数。
  • 一个 C 程序是从 main() 函数开始执行的。
  • main() 函数会自动调用,而不需要我们手动调用。
  • main() 函数的返回值可以是 “0” 或 “非 0 值”。如果是 0,则表示正常退出;如果是非 0 值,则表示程序异常退出。

“五花八门” 的 main() 函数

在很多书或者其他人写的代码中,对于 C main() 函数来说,我们经常会看到千奇百怪的写法,最常见的有以下 3 种。

// 写法 1
int main(void)
{
    ……
    return 0;
}

// 写法 2
int main()
{
    ……
    return 0;
}

// 写法 3
void main()
{
    ……
}

在大多数情况下,这 3 种写法是没有太大问题的。主要区别在于:写法 1 才是 C 语言官方的标准写法,而写法 2 和写法 3 是非标准写法(也叫做 “野生写法”)。实际上,在 C 语言官方标准(C99 或 C11)中,都规定了写法 1 才是标准写法。

如果是其他写法,可能使用某些编译器进行编译时,会给出一个警告甚至是一个报错。在实际开发中,我们也建议使用官方的标准写法。

注意: 虽然有些编译器允许使用 void main(),但这并不是标准的 C 语言定义。标准中 main() 函数的返回值类型应该是 int。使用 void main() 可能会导致一些平台上的兼容性问题,并且不符合 C 语言的标准规范,因此强烈建议避免使用这种写法。

C main() 函数的返回值

在 C 语言中, main() 函数应该返回一个整数值来告知操作系统程序的退出状态。

  • 返回 0:表示程序执行成功。
  • 返回非零值:通常表示程序在执行过程中遇到了错误。具体的非零返回值可以约定不同的错误代码,以便于调试和脚本处理。

在 main() 函数的末尾,我们通常会看到 return 0; 这样的语句,它表示程序正常结束。如果 main() 函数没有显式地使用 return 语句,那么按照 C99 标准规定,编译器会隐式地在 main() 函数的末尾添加 return 0;。

C main() 函数的限制

在 C 语言中,main() 函数的外部除了允许下面 3 种操作,我们一般不允许其他任何操作。

  • 引入头文件,比如 #include <stdio.h>。
  • 定义变量,比如 int a = 10;、#define PI 3.14 等。
  • 定义函数,比如 int sum(int a, int b){...}。

函数定义和变量定义都属于 “声明”,是允许放在外部的。但是,像 printf() 这样的 “执行语句”,必须放在函数内部才能执行。

示例:main() 函数外部的操作

#include <stdio.h>

printf("绿叶网");      // 非法操作
int main()
{
    printf("%d", 20);
    return 0;
}

分析:

在这个例子中,我们尝试在主函数 main() 外面使用 printf() 输出一个内容,编译代码时就直接报错了。

上一篇: C void 类型

下一篇: C 递归函数

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号