C语言中的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编译器环境下编译,若能编译通过,可研究下运行结果。
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函数开始的。
int main( void )
{
/* */
return 0; // 或 return EXIT_SUCCESS;
}
int main( int argc, char *argv[] )
{
/* */
return 0; // 或 return EXIT_SUCCESS;
}
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