vlambda博客
学习文章列表

C语言中的main函数

1. 关于main函数的描述。

在一个完整的C程序中,一般都有一个称为main的函数,我们把它称为主函数,它的特殊之处在于它是程序执行的起点。即该函数是由操作系统直接调用启动程序的执行。在main函数执行结束时会返回一个状态码给操作系统,操作系统可以检测这个状态码判断程序是否正常结束。

C语言规定,main函数不需要声明,但C90/C99要求main()函数的返回值为int类型,正常情况下应返回0。

在C标准中规定main()函数有以下两种形式:

int main(void) { /* ... */ }

int main(int argc, char *argv[]) { /* ... */ } 

//第二个参数也可以写作char ** argv

C90允许省略main函数的返回类型int,但C99以上标准不允许省略。在C标准中,若main不带参数时可以省略void,但认为省略void是一种过时的写法。另外,C99也允许编译器自定义其他形式的main()函数。

main函数运行结束时可通过显式执行return语句返回到操作系统,如果没有return语句,编译器也会为它自动增加一个return语句,使得程序结束后返回到操作系统。对于C90若省略return语句,main()函数返回的是一个不确定的值。但从C99开始规定,如果main函数里没有return语句,则要求编译器在编译时在main()函数结束前添加上“return 0;”语句。

C程序除了可以通过main函数中的return语句返回到操作系统外,还可能通过另外两种方法使程序退回到操作系统。第一种方法是通过执行某些标准函数,比如exit()或abort()等结束程序的运行。第二种方法是当程序在运行中发生了异常,比如发生了0除,程序会终止运行,并返回到操作系统。

2. 使用main函数误区

(1)void main(void){ /* ... */ }形式的代码是错误的写法。

在C标准中规定main()函数有以下两种形式:

int main(void) { /* ... */ }

int main(int argc, char *argv[]) { /* ... */ } 

显然void main(void){ /* ... */ }不符合标准,因此,它是一种错误的写法。虽然C99规定允许编译器自定义其他形式的main()函数,若按这条规定,这种void main(void)最多只能算是某种编译器"方言“而已,在学习C 语言时,按照一种“方言”编写代码极其不妥。

(2) 很多C教材在介绍main函数时常常这样描述:main函数只能作为主调函数去调用程序中其他函数,而其他函数不能调用main函数。

这句话是错的,因为在C标准中没有这样的定义。下面这个程序,main函数既可以递归调用,也可以被其他函数调用。感兴趣的读者可以试试,在不同的C编译器环境下编译,若能编译通过,可研究下运行结果。

#include <stdio.h>int ap=0;void f(int);int main(void) { static int a=0; f(a); a++; if (a==1) { ap=3; main();  } return 0;}void f(int a) { ++ap; if(ap<5) { printf("%d-%d\n",a,ap); main(); }}

(3) 一个程序必须有一个main函数,且程序从main函数开始执行。

这句话也是错的。C 程序的运行离不开一定的环境,这种环境叫做执行环境。这种环境有两种:独立环境和宿主环境。所谓独立环境是指程序并非借助操作系统来运行的,宿主环境则是指程序是在操作系统的控制下执行的。在这两种环境下,程序开始运行的标志是程序的某个指定的函数开始被调用。

在独立环境中,首先被调用的函数的名字并不一定是main,而是由编译器自行确定的,这叫做由实现定义。甚至这个首先被调用的函数的类型也同样是由实现定义的。只有在宿主环境下,C 程序的运行才是从main函数开始的。

3. 按标准正确编写main函数
形式1:
int main( void ){ /* */ return 0; // 或 return EXIT_SUCCESS;}
式2:
int main( int argc, char *argv[] ){ /* */ return 0; // 或 return EXIT_SUCCESS;}
如果程序执行到语句"return 0;"时,将0返回给操作系统。操作系统根据返回码判断程序是否正常结束,一般情况下,用0表示程序正常结束,非0表示程序在执行期间发生了问题。例如下面的程序,如果输入的值为负数,操作系统接收到的返回码为1, 如果 输入的值 为0, 操作系统接收 到的 返回 码为2。
#include <stdio.h>#include <stdlib.h>int main(void) { int value; printf("请输入一个大于0的整数:"); scanf("%d",&value); if (value<0){ printf("您输入了一个负整数。\n"); exit(1);  }else if (value ==0) { printf("您输入的数为0。\n"); exit(2); } printf("这是我需要的数:%d\n",value); return 0; }

参考文献:

[1]https://www.cnblogs.com/pmer/archive/2011/01/16/1936685.html