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. 【Android】12.3 在当前Activity中获取另一个Activity的返回值

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

  2. 淘宝/天猫API接口,item_sku - 淘宝商品SKU详细信息查询,淘宝/天猫获取sku详细信息 API 返回值说明

    欢迎使用淘宝API接口(item_sku - 淘宝商品SKU详细信息查询 ) 你好! 这是你使用我们的淘宝API接口获取商品详细接口说明. 测试地址:获取Key和secret 测试结果: Reques ...

  3. SQL中存储过程和函数的标准写法

    之前一直用的存储过程,今天忽然又接触到跑算法获取返回值的问题,想到可以用函数,好久没用过一时忘了怎么写,还要现查,于是就记录下来,顺便连存储过程一块啦. 存储过程: CREATE PROC dbo.存 ...

  4. 【前端06_JS_ECMA 语法标准】声明变量、数据类型*、tupeof返回值、输入输出、运算、循环、条件、函数*、事件*

    JavaScript_ECMA 概述 ECMA 语法标准 声明变量 全局变量 注释方法 数据类型 * typeOf 能返回的值 * 输入与输出 运算 算数运算 赋值运算 关系运算 关系运算中的特殊题目 ...

  5. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  6. python怎么让输出结果为01_python函数基础-参数-返回值-注释-01

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

  7. python函数调用位置_python函数定义,调用,传参,位置参数及关键字参数,返回值

    使用函数是真正开始编程的第一步,函数y=f(x)我们并不陌生,对x进行一顿操作得到一个值y.给不同的x,进行相同的操作,得到相应的y值. 程序层面函数是执行特定任务的一段代码,将一段代码定义成函数并为 ...

  8. springMVC获取异步请求的参数,返回异步请求数据(json),跨域访问简单了解,文件上传,与Restful风格

    springMVC获取异步请求的参数 JQuery发送异步请求回顾 <a href="javascript:void(0);" id="testAjax" ...

  9. python tkinter 弹窗_Python:tkinter-Parent获取弹出窗口的返回值

    获取窗口对象的返回值是一个很常见的模型,比如程序弹出一个窗口,读取用户的输入值,这个值可以很容易的保存在弹出的窗口中,但问题在于如何将这个值传递给弹出窗口的parent.这是一个看似很simple的问 ...

  10. python函数式编程读取数据时出现错误_Python编程中,函数遇到问题是抛出错误好还是约定返回值好?...

    这其实是一个编码规范的问题,没有任何场景都适用的解决方案,就好比有了 list,但是还是需要 tuple,所以对于抛出异常好,还是返回值好,是需要具体情况看的. 在 C 语言中,通用的做法是函数返回一 ...

最新文章

  1. 实验报告Linux操作系统基本命令,linux操作系统实验报告全部.doc
  2. ISME:水库蓝藻影响真核浮游生物的群落演替和物种共存
  3. Springboot-添加对jsp支持
  4. EOS 源代码解读 (2)插件-流程
  5. 千亿级流量来袭,如何用硬件加速技术为CPU减负?
  6. 二分图最大权匹配算法KM
  7. 探索Julia(part10)--自定义函数
  8. Visual Studio 2017 已知问题 Qamp;amp;A
  9. 如何用Java编写最快的表达式评估器之一
  10. 2020年1月数据库流行度排行:从万里挑二到波澜不惊
  11. python django 数据库查询方法总结
  12. UTF-16 -- 顶级程序员也会忽略的系统编码问题,JDK 错了十年!
  13. 数据结构_C语言_实验一_线性结构 ——一元多项式求导
  14. bootstrap css选择不同的宽度
  15. 华晨中华v3车质量怎么样_宝马发动机加持,销量仅个位数?这些车有点惨
  16. javascript 正则表达式小案例
  17. java linux任务管理器_Linux系列教程(二十四)——Linux的系统管理
  18. Github desktop界面全白怎么办?[已解决]
  19. TX1、跨平台文件传输工具\使用记录
  20. 学习MyBatis-Plus

热门文章

  1. 对于Y=Hx的H细节的一些讨论
  2. 通过反射获取类的完整结构(1)--属性方法
  3. 2020 快手 被吊打面经
  4. CS231n李飞飞计算机视觉 神经网络训练细节part2上
  5. jar命令成功完成 java -jar 命令却提示“没有主清单属性”!
  6. 最新回归算法理解、实现及应用(1)线性回归
  7. Raki的读paper小记:LOOKING BACK ON LEARNED EXPERIENCES FOR CLASS/TASK INCREMENTAL LEARNING
  8. java map格式化_字符串模板格式化输出map 值
  9. 用php远程获取MySQL到本地,mysql本地从远程数据库导数据_MySQL
  10. 【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树