「C语言」int main还是void main?
从大一入学刚接触C到现在已满7个月了,虽然刚开始就知道```int main```才是标准的写法,但一直没有深刻理解为什么不能用```void main```而必须使用```int main```。
刚好最近有非计算机相关专业学C的同学问我```int main```、```main```和```void``` ```main```有什么区别,便觉得是时候好好整理一番了,于是有了此博客。
先简而言之
1.void 和 int 表明声明不同的主函数返回值,不声明则默认返回值为int整型。
2.int main可移植性强。
3.C语言从来没声明过```void main```,只声明过```main()```。
3.抛弃一切用```void main```编写C程序的习惯!
稍微深入
main函数,又称主函数,作为绝大大部分C程序唯一的入口(比如windows编程中可以编写一个其他windows程序都可以使用的动态链接库(dll)模块,由于DLL模块不是独立的程序,因此不需要main函数。再比如,用于专业环境的程序-----如机器人中的控制芯片--可能不需要main函数),是要求有返回值的,该返回值返回给操作系统来表明改程序的执行状况。返回0代表程序正常执行成功,返回非0值代表程序异常结束,因此返回值需要是int整型,于是有了```int main()```的规范。如果使用```void main```,既声明主函数没有返回值的话,程序随能编译、运行成功,却不利于操作系统判断其状态,这对于由很多C程序构成的大型项目来说是可能会是致命的。
尤其从c99标准(1999年制定的官方C语言标准第二版)开始必须使用```int main```,如果没加```return 0;```语句C99要求编译器自动添加(自己写上是个好习惯)。只声明```main```的话系统默认为```int main```。```void main```无论何时都不应该使用因为主函数必须有返回值表明程序运行状态(在很少的代码中最少不使用```void main```是一个良好的变成习惯)。
学校老版教材推荐编写C程序时使用的 VC6.0 是98年的产品,而C99标准见名思义在1999年制定,因此VC 不会自动添加```return 0;```。Windows下建议尝试使用DEV C++或Visual Studio的IDE环境(集成开发环境)写C代码。
再深入一点
在最新的 C99 标准中,只有以下两种定义方式是正确的:
int main(void){}//整数类型主函数(无类型)
int main(int argc,char **argv)//整数类型主函数(整数类型 统计参数个数,字符类型*数组指针至字符[])
如果没有int main并且不是return 0;的话,编译完C程序后生成了exe文件,在DOS(按下Windows键+r键后输入cmd打开)下用执行该文件的命令时(比如是1.exe),语句后面加上 && dir 就会发现并没有列出当前目录的列表!(&& 是按先后顺序执行两条命令的连接符,dir命令在DOS下用来列出当前所在文件下的目录列表的~)
为什么没执行成功dir命令呢?正是因为写的C程序没有返回值,操作系统认为程序没有成功执行完毕,因此就不会执行 && 后面的dir命令了…
上面两种正确的定义方式一般接触C语言阶段用前者足以,括号里面的void指明主函数并不需要参数,而后者:
int main(int argc, char *argv[]);
表明main函数返回值为整型,带两个参数,argc为命令行参数的个数,argv为指针数组,前argc个指针为参数列表,最后一个指针值为NULL。具体见下方链接。
参考链接和可深入理解C的其它链接:
main函数_百度百科:http://baike.baidu.com/link?url=QPL_sSuIxACVYcdTzY43iXtxLGWUPY8inpjL2hZZPFscJZehGeHPUlqf_qG2xPtKKY-tlZPrm78Rsw3TwM-D7a#4_3
C99_百度百科:http://baike.baidu.com/link?url=wGdu4AOAT462i_loNUmdUSqMYXoE-Dur0qQSuHRkXbdy-ib-wMnLp7rrJIwhh_tkf1fICH4JcUkMZ_4n_yIOy_
void main()还是int main()_百度贴吧:http://tieba.baidu.com/p/2085028518
int main(int argc,char* argv[])详解:http://www.cnblogs.com/avril/archive/2010/03/22/1691477.html
C语言启动代码:http://blog.sina.com.cn/s/blog_53c1950a01011vch.html
「C语言」int main还是void main?的更多相关文章
- 「C语言」文件的概念与简单数据流的读写函数
写完「C语言」单链表/双向链表的建立/遍历/插入/删除 后,如何将内存中的链表信息及时的保存到文件中,又能够及时的从文件中读取出来进行处理,便需要用到”文件“的相关知识点进行文件的输入.输出. 其实, ...
- 「C语言」常量和变量的表示、应用和变量命名规则
在程序运行中,其值不能改变的量成为常量. 在基本数据类型中,常量可分为整型常量.实型常量.符号常量和字符型常量(包括字符常量和字符串常量),现分别介绍如下: 目录: 一.常量 二.C语言标识符 三.变 ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
- int main()还是void main()
按照新的C99标准,即使函数本身没有定义返回值,编译器也会加上,以返回给激发程序,运行状态.很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过 ...
- 「C语言」原码反码补码与位运算
尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解. 本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出. 目录 ...
- 「C语言」单链表/双向链表的建立/遍历/插入/删除
最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...
- 「C语言」C输出hello world!系统发生了什么?
本篇文章全部摘抄自学长博客供以后学习: http://efraim.me/2015/12/05/tech-linux-2015-12-05/ 排版因与博客园编辑器不同而稍作修改. 输出hello wo ...
- 「C语言」数据类型及混合运算与类型转换
深入学习C语言时,有必要先了解一下数据类型的概念,以及它们之间的混合运算与类型转换. 本篇文章便是根据<C语言程序设计教程>和在线翻阅资料后整理而出.(练习题将逐步更新) 目录: ...
- 「C语言」在Windows平台搭建C语言开发环境的多种方式
新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于 Windows 平台搭建C语言集成开发环境 ...
随机推荐
- 自己做的加速app测试流程的小工具,目前打算开放使用,想注册的朋友抓紧了,嘻嘻
为了加速小团队app的测试流程做了这个东西,www.xunce.net 主要特性: web: 一键上传app,方便随时下载 备注测试要点 添加附件,如checklist等文档 自动识别app版本,名 ...
- Linux下MySQL不能远程访问
最近在Linux上装了个MySQL数据库,可是远程连接MySQL时总是报出erro 2003: Can't connect to MySQL server on '211.87.***.***' (1 ...
- NetBPM的安装 -转
NetBPM的安装还是比较简单的,有比较详细的文档. 1.当然是先下载运行程序了, netbpm-0.8.3.1.zip ,官方网站:http://www.netbpm.org:2.然后解压后自己看 ...
- Devexpress treelist 树形控件 实现带三种状态的CheckBox
树形控件是使用频率很高的一种控件.对于属性控件往往需要下面两个功能 1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中).使用 ...
- Android使用SurfaceView实现墨迹天气的风车效果
SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...
- Ubuntu 12.10
上海交通大学更新服务器(教育网千兆接入,联通/电信线路情况不详),包含其他开源镜像: deb http://ftp.sjtu.edu.cn/ubuntu/ quantal main multivers ...
- 转:Transform Web.Config when Deploying a Web Application Project
Introduction One of the really cool features that are integrated with Visual Studio 2010 is Web.Conf ...
- 【原创】14. MYSQL++之SSQLS(原理解析)
从之前所介绍的SSQLS的介绍中我们可以感受到,SSQLS的精髓应该在sql_create_#这个宏,他所创建出来的这个结构体将会是突破的关键,所以我将会从以下顺序入手. 1. sql_create_ ...
- SpringMVC 拦截器
类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常用场景: 1.日志记录:记录请求信息的日志,以便进行信息监控.信息统计.计算PV(Page View)等. 2.权限 ...
- MPU9250调试
MPU9250 芯片概述 MPU9250芯片是一个9轴姿态传感芯片,其中包含了3轴加速度传感器.3轴角速度传感器以及三轴磁力计. 其本质上是MPU6050芯片+AK8963. 可以获取传感芯片的加速度 ...