C语言常见问题(二)——主函数main与return 0

目录

一、int main与void main

二、关于return 0

三、带参数的main函数


一、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”,如图。

 

 

 

 

  • 18
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要实现卫星环绕地球的动画效果,可以使用OpenGL图形库来绘制图形和动画。下面是一个简单的C语言程序示例,可以实现卫星绕地球的动画效果: ```c #include <GL/glut.h> #define PI 3.1415926 GLfloat angle = 0.0f; // 卫星角度 GLfloat r = 10.0f; // 卫星距离地球表面的距离 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // 绘制地球 glColor3f(0.0f, 0.0f, 1.0f); glutWireSphere(5.0f, 20, 20); // 绘制卫星 glColor3f(1.0f, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -r); glRotatef(angle, 0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 0.0f, 5.0f); glutWireSphere(0.5f, 8, 8); glutSwapBuffers(); } void update(int value) { angle += 1.0f; if (angle > 360.0f) { angle -= 360.0f; } glutPostRedisplay(); glutTimerFunc(25, update, 0); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(640, 480); glutCreateWindow("Satellite Orbiting Earth"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glutDisplayFunc(display); glutTimerFunc(25, update, 0); glutMainLoop(); return 0; } ``` 程序中使用了OpenGL的三维图形绘制和动画技术。首先通过glutWireSphere函数绘制了地球,然后通过glTranslatef和glRotatef函数设置卫星的位置和旋转角度,最后再用glutWireSphere函数绘制卫星。 update函数控制卫星的旋转,通过glutTimerFunc函数定时更新卫星的位置和角度,并调用glutPostRedisplay函数来重绘窗口。主函数中注册了display和timer函数,并调用glutMainLoop函数启动程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易水卷长空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值