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. nno Setup入门(一)——最简单的安装脚本

    一个最简单的安装脚本: 1.最简单的安装文件脚本: [setup] AppName=Test AppVerName=TEST DefaultDirName="E:\TEST" Ap ...

  2. openssh基于源码编译覆盖式安装

    覆盖式,就是卸载旧的openssh,打扫干净屋子再请客... 注意:请做做好测试工作 00.查看本机已安装的openssh rpm –qa |grep openssh rpm -e openssh-s ...

  3. Android短信管家视频播放器代码备份

    自己保留备份,增强记忆   这是video的类 public class VideoActivity extends Activity { /** * 解析网络页面 */ private WebVie ...

  4. EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手

    ----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程03-数据结构 ...

  5. ubuntu直接删除文件而不是移动到回收站

    如你所知,你可以在文件(或者文件夹)上面点击右键选择“移动到删除文件夹”或者把它拖动到屏幕右下角的回收站里面来上传文件.唯一的问题是,在回收站里面的文件除非你手工清理不然不会自动清除,这可能导致安全问 ...

  6. iOS 10 的一个重要更新-自定义的通知界面

    续上篇,在简单闹钟的例子上,在通知界面上显示图片动画,并用通知关联的按钮更新通知界面.介绍 iOS 10 通知 API 的扩展:自定义通知显示界面. 新框架可以统一处理本地通知和远程推送,同时增加了一 ...

  7. Python学习笔记(六)—— 条件判断

    一.语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> e ...

  8. hadoop遇到的问题及处理

    1:杀掉hadoop作业 列出作业 ./hadoop job -list 杀掉 ./hadoop job -kill job_id 1:某些节点出现running asprocess XXX. Sto ...

  9. 使用JMeter对网站并发性测试

    目录结构: contents structure [+] 1. 下载JMeter 2. 启动JMeter 1) 建立线程. 2) 设置请求服务器.压力链接等信息 3) 查看运行结果 3,分析数据 Ap ...

  10. CocoaPods iOS 开源库管理

    1.CocoaPods 简介 1.1 CocoaPods CocoaPods 是 macOS 和 iOS 下的一个第三类库管理工具,通过 CocoaPods 工具我们可以为项目添加被称为 " ...