main函数表示法

       很多同学在初学C或者C++时,都见过各种各样的main函数表示法:

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

       看过这么多写法之后,不禁顿生疑惑,到底哪个才是main函数的标准写法?

main函数的标准写法

       先看C语言标准文档里对main函数的描述:

       再看C++标准文档里对main函数的描述:

       附:标准文档下载跳转链接——C语言标准

                                                ——C++标准

       

       至此,可以看到,在C语言中,标准写法是int main(void)和int main(int argc, char *argv[]),在C++中,标准写法是int main()和int main(int argc, char *argv[])

       那么写成main()或者void main()到底行不行?答案是不一定行。在旧的编译器上,这样写也能通过,但主要是为了兼容C/C++标准未出来之前的历史代码。在较新的编译器上,这样写都会得到一个警告信息,或者,干脆就是错误信息,无法通过编译。所以,为了代码的规范性,通用性,请坚持按标准文档里推荐的写法来写。尤其是初学者,按标准来写是一种很好的习惯,而编程中的好习惯甚至比编程本身还重要!

       还有人疑惑main函数第二个参数到底是char *argv[]还是char **argv?答案是都行,argv首先是一个数组,其数组元素的类型是字符指针,每一个字符指针都指向一个特定的字符串,如下图:

       此外,也许还有人对main函数的参数名称有疑问,既然main函数也是个函数,那么它的参数名称argc、argv可以替换成其它合法的标识符吗?这个答案也是肯定的,如果心血来潮,写成int main(int a, char *b[])这种形式也是被允许的,但是仍然建议按argc、argv写,避免不必要的疑惑。

 

main函数为什么要有返回值和参数值

       简单地说,为了与系统环境通信,这里里系统不一定就是操作系统,也可以是其他调用的它的上层环境。

       main函数是系统执行程序的入口,可以将main函数看做是供系统调用的。既然系统可以调用main函数,那么系统就有为main函数传递指令(参数)的需求,同时,main函数也有为系统环境返回信号的义务。这样一来,参数充当入口,return充当出口,使得main函数的功能更加完善。

 

获取main函数的参数值

       既然main函数可以有参数,那么就一定可以获取它的参数值,只要为它传入指定的实参,就可以在main函数中把它打印出来。

       先写一段打印参数的代码,命名为text.c,编译,默认结果显示argv[0]存储函数名称及其路径,而argv[argc]为空指针:

       打开cmd命令窗口,切换至程序所在目录,为本程序传入参数:

       显然,打印出的参数内容与我们的预期一致。

 

获取main函数的返回值

       同理,main函数既然为系统返回了信号,那么系统也一定可以获取到它。重写编写源文件,这次我们把无关部分全部略去,只剩返回值。

       先编译,然后打开cmd窗口切换至当前程序目录下,输入text.exe,回车后,再输入echo %errorlevel%,然后就可以看到打印出的返回值了:

       除了这种方法,也可以用main函数调用main函数本身来打印它的返回值,但是这样做就相当于让main函数进入了递归调用当中,必须设定恰当的终止条件,否则程序将陷入无限递归,进而崩溃。

 

小结

       由此可以看出,main函数除了可以与系统通信外,与普通函数还是很一致的,说到底,它也只是个函数么。

       编程中,一些语法是标准所强制要求的,另一些语法标准里并未强制要求,而是建议,或者连建议都没,只是由编译器的实现而定。这时候,就要尽量按标准里强制的或者建议的语法去书写程序,这样做可以极大地保证程序的健壮性。

探寻main函数的“标准”写法,以及获取main函数的参数、返回值的更多相关文章

  1. C/C++ 错误笔记-解决swap函数与标准库的std::swap函数冲突的问题

    下午写了一份代码: #include <iostream> using namespace std; // 模板1:交换基本类型的值 template<typename T> ...

  2. 使用JS,获取URL中指定参数的值

    /** * 获取URL中指定参数的值 * * @param name 参数名称 * @returns */ function getQueryString(name) { var reg = new ...

  3. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 在上一节的示例中,通过StartActivity(Intent)方法启动另一个Activity后,这两个Activ ...

  4. .net core 无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了

    使用vs 发布.net CORE 项目,调试遇到了“无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化掉了”这个问题,弄了半天才发现是发布的时候没有设置为debug,做个总 ...

  5. python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 # 可以减少代码冗余,增加代码复用性 # 使代 ...

  6. arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值

    环境及代码介绍 环境和源码 由于有时候要透彻的理解C里面的一些细节问题,所有有必要看看汇编,首先这一切的开始就是从汇编代码进入C的main函数过程.这里不使用编译器自动生成的这部分汇编代码,因为编译器 ...

  7. 获取动态SQL查询语句返回值(sp_executesql)

    在写存储过程时经常会遇到需要拼接SQL语句的情况,一般情况下仅仅是为了执行拼接后的语句使用exec(@sql)即可. 而今天的一个存储过程却需要获取动态SQL的查询结果. 需求描述:在某表中根据Id值 ...

  8. Swift 定义函数 参数 返回值

    定义多参数函数 - 用func声明函数  func name(parameters) -> return type { function body } func halfOpenRangeLen ...

  9. python函数1_参数,返回值和嵌套

    函数 将重复的代码,封装到函数,只要使用直接找函数 函数可以增强代码的模块化和提高代码的重复利用率 函数的定义和调用 格式 def 函数名([参数,参数...]): 函数体 定义函数 import r ...

随机推荐

  1. Qt Installer Framework 使用说明(一)

    目录 Qt Installer Framework 使用说明 1.Qt Installer Framework概述 选择安装包类型 促进更新 提供安装内容 2.入门指南 支持的平台 从源代码构建 支持 ...

  2. Centos7 安装 docker-ce

    本文参考官网地址:https://docs.docker.com/install/linux/docker-ce/centos/#os-requirements 1.卸载旧版本的docker $ su ...

  3. 小米路由Mini刷Breed, 潘多拉和LEDE

    1. 下载breed,地址 http://breed.hackpascal.net/ 2. 下载小米Mini的开发板rom, 地址 http://www1.miwifi.com/miwifi_down ...

  4. 俄罗斯方块-C语言-详注版

    代码地址如下:http://www.demodashi.com/demo/14818.html 俄罗斯方块-C语言-详注版 概述 本文详述了C语言版俄罗斯方块游戏的原理以及实现方法,对游戏代码进行了详 ...

  5. vscode用法

    工欲善其事,必先利其器.vscode是一个值得花费时间去掌握精通的编辑器. 好文档不必远求 打开vscode,把菜单看上三遍,仔细思考每个菜单项的作用,思考为啥要这样归类每个菜单项. 配置是系统的核心 ...

  6. JavaScript indexOf() 方法详解

    定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) 参数 描述 sea ...

  7. Xcode 常用调试技巧总结

    NSLog,po命令和普通断点调试相信每个iOS开发者都会,这里就不作介绍了. 一.Memory Graph Xcode8新增:Memory Graph解决闭包引用循环问题 有很多叹号说明就有问题了. ...

  8. 业务、架构、技术,我们应该关注什么 Java和.Net的优势劣势简单看法 市场经济决定,商业之道即是软件之道,市场的需求决定着软件技术的发展 利益决定着选择应用新技术

    业务.架构.技术,我们应该关注什么 一个企业存在的必然和前提就是获取企业生成的利润,怎么样合法合理取得利润呢,企业怎么样生存下去呢,很简单,为客户提供等值的产品与服务,客户支付你相应的报酬. 我们是从 ...

  9. 【转】写给支持和反对《完全用Linux工作》的人们

    早就有人问起我的学习情况,问我有没有找到理想的研究环境.我却总是弄一些小动物,要不就是好玩的内容在这上面.真是惭愧,因为一直觉得自己还没有什么发言权,一直觉得是不是自己搞错了.不过来了 Cornell ...

  10. 【转】Braid - 一个发人深思的游戏

    Braid - 一个发人深思的游戏 我已经很久很久没有打游戏了(如果不算 Angry Birds 之类用来打发时间的游戏的话).我的最后一个真正意义上的游戏机,是 PlayStation 1.在那上面 ...