前言

从开始学习C语言到现在,我们似乎看到了很多个版本的main函数,那么哪一种才是正确的呢?我们先来看看目前有哪些版本。

main函数版本

第一种,没有返回值,没有入参:

main()

在C89标准中,这种写法是可以接受的,但使用现在的编译器编译时,会报告警,并且会将其返回值默认为int。实际上,如果函数没有显式声明返回类型,那么编译器会将返回值默认为int。

第二种,返回值为void,没有入参:

void main()

这种形式的来源不得而知。但是为何这么多初学者使用?main函数的返回值最终会作为程序的退出状态,而一旦声明为void,在程序退出后,想要获取其退出状态也就不可以了。因此不建议其返回值为void。

第三种,返回值为int,参数为void:

int main(void)

这是常见的一种写法。形参为void,表明它在调用的时候不能传入任何参数,那么它也就不能获取命令行参数了。

第四种,返回值为int,没有参数:

int main()

看起来似乎和第三种没有什么区别,但这种形式却有些许不同。虽然它的声明没有入参,实际调用却可以传入参数,看下面的例子:

#includevoid  test();int main() {     test(4);    return 0; }void test(int a){    printf("%d",a);}

对于上面的程序,我们仍然可以编译并正常运行,test函数虽然声明为无入参,但调用时却是可以传入任何参数或不传参数的。

第五种,返回值为int,有两个入参:

int main(int argc,char *argv[])

这也是最常见的一种写法。第一个入参为命令行参数个数,第二个入参为命令行参数数组。通常用于实现需要从命令行获取参数的功能。

第六种,返回值为int,有三个入参:

int main(int argc,char *argv[],char *envp[]

这种和第五种相似,但多了一个参数,用于获取环境变量,这种形式多源于编译器的扩展。但全局变量environ可以代替envp的作用,获取或者设置环境变量可以使用getenv或putenv,因此也没有必要使用该形式。

没想到吧,仔细数一数竟然有这么种写法?但是真相究竟如何?到底使用哪种呢?

真相大白

C89/C99/C11标准文档中只提供了两种main函数的写法

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

也就是说,其他的写法都是不符合标准的,有的是历史遗留问题,有的是编译器扩展,更有的不知从何而来。当然对于带参数的写法,其参数名可自定义。另外对于除标准提供的以外的写法,不同的编译器有不同的处理策略,有的可能编译不过,有的可能报警告,但一个“正经”的编译器是不会对标准提供的形式产生质疑的。

总结

至此,我们已经知道了c语言main函数的写法,我们来总结一下前面的内容:

  • C标准只提供了两种main的形式,即前面提到的第三种和第五种。
  • 为了代码的通用可移植性,建议采用标准提供的形式。
  • 不需要命令行参数可采用第三种,需要命令行参数采用第五种。
  • 如果一个函数确定无需传入任何参数,那么用void限定是一个不错的选择。
  • 函数没有声明返回值时,编译器默认其返回值为int。

关注我:带你遨游代码的世界~

获取更多:私信 “资料” 获取

c语言srand函数怎么用_C语言的main函数到底该怎么写相关推荐

  1. c语言从入门到精通_C语言基本概念(上)【C语言入门到精通】

    C语言基本概念 Syntactic sugar causes cancer of the semi-colons.[0] 码字不易,对你有帮助 点赞/转发/关注 支持一下作者 微信搜公众号:不会编程的 ...

  2. C语言编程>第二十一周 ⑥ 请补充main函数,该函数的功能是:从键盘输入一个字符串,即一个指定,然后把这个字符及其后面的所有字符全部删除,结果仍然保存在原串中。

    例题:请补充main函数,该函数的功能是:从键盘输入一个字符串,即一个指定,然后把这个字符及其后面的所有字符全部删除,结果仍然保存在原串中. 例如:输入"1234567",指定字符 ...

  3. C语言编程>第二十一周 ② 请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中。

    例题:请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中. 注意:仅在横线上填写所需的若干表达式或语句,请勿改动函数中的其它任何内容. 代码如下: #include& ...

  4. C语言编程>第二十三周 ⑤ 请补充main函数,该函数的功能是:求1~100(不包括100)以内所有素数的平均值。

    例题:请补充main函数,该函数的功能是:求1-100(不包括100)以内所有素数的平均值. 仅在横线上填写所需的若干表达式或语句,请勿改动函数中的其它任何内容. 代码如下: #include< ...

  5. c语言prime函数怎么用_C语言教程_v20201106

    编程基础 1.1    通俗地理解什么是编程语言 1.2    C语言究竟是一门怎样的语言? 1.6    初中毕业能学会编程吗? 1.7    C和C++到底有什么关系? 1.8    学了 C 语 ...

  6. c语言程序 中断函数示例,单片机_C语言函数_中断函数(中断服务程序)

    c语言中的中断函数注意事项 单片机_C语言函数_中断函数(中断服务程序) 在开始写中断函数之前,我们来一起回顾一下,单片机的中断系统. 中断的意思(学习过微机原理与接口技术的同学,没学过单片机,也应该 ...

  7. c语言prime函数怎么用_C语言 要发就发

    点击上方"蓝字"关注我们 愉快的一天,不得不做的三件事: 种田,锄地,整代码!!! [题目] "1898--要发就发".请将不超过1993的所有素数从小到大排成 ...

  8. c语言string函数的用法_C语言基础| 指针和函数

    点击蓝字关注我们 指针和函数 栈帧:当函数被调用时,系统会在stack空间上申请一块内存,用来给函数提供空间,存储形参和局部变量(定义在函数内部的变量). 当函数调用结束时,这块内存空间会被自动释放( ...

  9. C进阶_C语言_函数与指针_C语言指针进阶

    上一篇博客http://t.csdn.cn/GYCiM 我们了解了指针相关知识,今天来了解函数和指针的关系. 目录 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 qsort 冒泡排序模拟实 ...

最新文章

  1. Canvas基础知识
  2. 如何用python的i2c教程_使用Raspberry pi3(Python)的I2C用法
  3. 《读书报告 – Elasticsearch入门 》----Part II 深入搜索(2)
  4. L2-008. 最长对称子串-PAT团体程序设计天梯赛GPLT
  5. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子
  6. python循环输入数组_python数组循环处理方法
  7. [Java] java打飞机小游戏
  8. Visual Studio 2022把C#代码打印出来的技巧 有屋设计拆单管理一体化软件 全屋定制拆单 橱柜衣柜整装 木门归方程序
  9. java中文转换为拼音的pinyin4j学习笔记
  10. 切换电脑计算机名称软件,多电脑切换器
  11. C/C++捕获段错误,打印出错的具体位置(精确到哪一行
  12. Java-超市购物小票案例-详细介绍
  13. spring-boot 与 dubbo
  14. 5、用Python编程,假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
  15. java怎么取随机数_java怎么产生随机数
  16. QQ好友辅助验证不要信
  17. 简单两步, 搭建全平台私有同步网盘
  18. 移动应用技术开发大作业——Android平台个人简历
  19. java 声明一个bus类_Java初级阶段测试附带答案
  20. linphone-自动接听视频电话

热门文章

  1. 剑指offer之11-15题解
  2. 让代码自动补全的全套流程
  3. Kubernetes Ingress 控制器的技术选型技巧
  4. HTTP basic auth
  5. Linux shell脚本基础学习详细介绍(完整版)2
  6. 拼多多的真实面试题:数亿的用户,如何用Redis统计独立用户访问量
  7. Hadoop权威指南 _03_第I部分Hadoop基础知识_第1章初识Hadoop.
  8. JavaSE各阶段练习题----Map
  9. JAVA程序设计----多线程(上)
  10. leetcode 476. Number Complement | 476. 数字的补数(位运算)