目录
一、int main与void main
1.main函数标准写法
C99标准规定C语言main函数返回类型一定为int,并且只有两种写法:
1)标准写法一(无参数)
int main(void) { /* ... */ }
在C++中,int main()和int main(void)没有任何区别。但是在C语言中,int main()是可以传入参数的,而int main(void)则不能传入参数。
2)标准写法二(带参数)
int main(int argc,char *argv[]) { /* ... */ }
int main(int argc,char **argv) { /* ... */ } //与标准写法二等价
C语言允许main函数带参数,其中argc表示参数个数,argv[0]为程序的路径,argv[1]指向命令行中执行程序名后的第一个字符串,argv[2]指向第二个字符串...以此类推。
2.关于void main
但有时我们会见到main函数的其他写法,比如main()和void main()。
首先谈谈main(),对于main()大多数编译器是按int main()类型处理,即使你没写return语句,编译器也会在程序末尾默认加上return 0;。但是考虑到程序的可移植性,最好不要采用这种写法。
然后是void main(),这种写法在老版本的C语言代码中比较常见,不过现在的一些教材中仍存在这种写法,事实上这种写法是错误的、不规范的,因为C标准中从来没有规定void main()这种写法。
有同学会说:“我尝试了void main(),是可以使用的。”的确,有的编译器比如VC6.0(C89)是支持void main这种写法的,但并非所有编译器都是如此,很多编译器是不支持这种写法的,比如codeblocks(如下图)。所以为了程序的可移植性,最好不要采用void main这种写法。
补充说明一下,void main()这种写法在单片机中比较常见,因为不需要返回值给操作系统。
二、关于return 0
1.下面是一个非常简单的C程序
#include<stdio.h>
int main(void){
printf("Hello world!");
return 0;
}
可以看到,在程序结尾处有一条语句“return 0;”,作用是返回整数0给操作系统,表示程序正常运行结束了。由于C99规定C语言的main函数一定是int类型,也就是说main函数会返回一个整数。如果返回0,则代表程序正常退出;如果返回值非0,则表示程序出现了异常。这个返回值在操作系统的命令行窗口是可见的。(注意一下main函数返回值是返回给操作系统的,只要你设置返回值了,并不会影响你当前所编写程序的执行。)
有时即使我们忘了写return 0,程序也能正常运行,这是因为C99 规定编译器要自动在生成的目标文件中加入return 0。但是要注意,vc6.0编译器并不会自动为你加上return 0(可能因为vc6.0是98年的产品,所以不支持这个特性),这时编译器会报错。所以,我们平时在写代码的过程中,一定要养成给main函数设置返回值的习惯。
2.我们可以尝试一下让main函数返回其他值
#include<stdio.h>
int main(void){
printf("Hello world!");
return 1;
}
3.我们可以利用main函数的返回值来控制多个程序的执行
举个例子:
1)我们新建一个程序p1
2)再新建一个程序p2
3)编译生成p1、p2的exe文件之后,打开命令行窗口(键盘[Win]+[R]-->输入cmd)
4)输入p1.exe的路径,尝试运行一下p1程序,可以看到运行结果
5)为了操作方便,我们先跳转到p1.exe所在目录下。然后输入“p1 && p2”
(p1 && p2的含义是: 执行程序p1。如果程序p1正常退出,则继续执行p2;否则不执行p2)
6)现在我们修改p1程序,让main函数返回1(记得编译一下)
7)在cmd窗口执行“p1 && p2”,可以看到只有p1运行了。
三、带参数的main函数
1.Linux下的许多命令都是带参数的,C语言也允许main函数带有参数。我们先回顾一下带参数的main函数的标准写法:
int main(int argc,char *argv[]) { /* ... */ }
其中argc表示参数个数,argv[0]为程序的路径,argv[1]指向命令行中执行程序名后的第一个字符串,argv[2]指向第二个字符串...以此类推。
2.下面是一个main函数带参数的程序p1
#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[]){
int i=0;
printf("文件路径: %s\nmain参数个数: %d\n参数列表:",argv[0],argc);
for(i=1;i<argc;i++){
printf("argv[%d]=%s ",i,argv[i]);
}
printf("\n");
if(argc>1){
if(strcmp(argv[1],"1")==0)
printf("fun1\n");
else if(strcmp(argv[1],"2")==0)
printf("fun2\n");
else if(strcmp(argv[1],"3")==0)
printf("fun3\n");
else
printf("error!");
}
return 0;
}
进入命令行窗口,跳转到p1.exe所在目录后,依次输入“p1”“p1 1”,“p1 2”,“p1 3”,如图。