基本上,没有人会将大段的C语言代码全部塞入 main() 函数。更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数。C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常常产生不同的输出结果。

C语言函数的返回值

C语言函数可以通过返回值表示输出结果,例如 log() 函数的返回值会根据不同的输入,返回不同的值。再比如,我们定义一个函数 myopen(),用于打开某个文件,那么,这个函数要么能够成功打开文件,要么打开文件失败,这时,可以通过返回值区分“成功”和“失败”。

当然,myopen() 函数失败的原因可能很多,但不是本文关注的重点,本文更关心的是,该以何值表示“成功”,何值表示“失败”。按照C语言语法, 0 表示假,非零(常常用 1)表示真,那是否函数也用 0 返回值表示“失败”,1 返回值表示“成功”呢?

“行业潜规则”

C语言函数当然可以使用返回值 0 表示“失败”,用返回值 1 表示“成功”。事实上,C语言函数用什么样的返回值表示成功或者失败,只是一种人为的约定,函数的调用者遵守这个“约定”就可以了。

C语言也有“行业潜规则”

不过,对于一般的函数,大多数C语言程序员常常使用返回值 0 表示成功,非零值表示失败。因此,如果希望我们定义的函数能够被大多数人愉快的使用,最好不要反其道而行,遵守“行业潜规则”更好一点。

仔细考虑下,其实C语言函数使用返回值 0 表示成功是有原因的。更一般的C语言函数返回值并不一定只有两种可能值(成功/失败),它可能还会返回对应错误原因的返回值。总之,函数成功只有一种可能,函数失败却有多种可能。

实数要么是 0,要么非 0,因此可以将 0 看作一个比较特殊的“唯一”数值,使用 0 这个“唯一”的返回值,表示唯一的“成功”,多种非零的返回值,表示多种原因的失败,无疑更好一些。

当然,我们也可以说“实数要么是 1,要么非 1”,不过这显然也不是“行业潜规则”。

例如我们可以规定,如果 myopen() 函数因为“文件或者目录不存在”的原因失败,返回 -1,如果因为“权限不够”的原因失败,则返回 -2。-1 和 -2 都是“非零值”,而成功作为失败的对立面,也即“非零值”的对立面,myopen() 函数使用返回值 0 表示成功无可厚非。

C语言程序员中还有一种“行业潜规则”

当然,C语言程序员中还有一种“行业潜规则”。如果定义的函数是个布尔函数,也即返回值显式的使用类似于 bool 关键字定义,或者函数名类似于 is_true(),那么显然此时应该遵守C语言语法,使用“真”值表示成功,“假”值表示失败。

if( is_true() )
printf("true\n");

请看上面这两行C语言代码,显然,遵守C语言语法的布尔函数更便于程序员写出布尔判断类的代码。

小结

本文主要讨论了C语言程序开发中关于函数返回值的问题。可见,使用什么样的返回值表示成功,什么用的返回值表示失败,其实只是一种人为约定。只不过,如果希望我们编写的代码能够被大多数同行愉快的使用,最好遵守下“行业潜规则”。当然了,若是希望我们的C语言代码应用性更广,则可以使用标准头文件里预先定义好的 EXIT_SUCCESS 和 EXIT_FAILURE 宏。

END

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

当C语言函数执行成功时,返回1和返回0究竟哪个好?相关推荐

  1. C语言 | 函数执行成功时,return 1 还是return 0?

    今天分享的内容是关于函数执行成功,返回0还是1的讨论~ 基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封 ...

  2. c语言exit在哪个头文件_C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

  3. C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

  4. Spark修炼之道(高级篇)——Spark源码阅读:第九节 Task执行成功时的结果处理...

    Task执行成功时的结果处理 在上一节中,给出了Task在Executor上的运行代码演示,我们知道代码的最终运行通过的是TaskRunner方法 class TaskRunner(execBacke ...

  5. mysql的过程返回执行成功与失败_mysqli_query函数执行成功返回一个结果标识符,失败时返回false...

    数执识符失二醇纳米制备脂E丙烯维素丁酯聚乙聚乳基纤氰基粒的.磷.乙材料酸异酸D. 行成二醇片的凝胶骨架.甘棕榈纤维可用为A.单聚乙甲基于亲油酯油E.乙材料水性酸甘素D. 墨客古代文人往往寄情山水,功返 ...

  6. python语言函数库_Python 的标准库,从0到1学Python

    1.1. 介绍软件测试业务流程的梳理技巧 - 乐搏软件教育 - 软件测试 - Powered By EduSoho​17lebo.com Python 的标准库包括了很多的模块, 从 Python 语 ...

  7. python函数执行shell_6方法,python中执行shell命令

    原创文章, 禁止转载 Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻易地包装使用其他语言编写的库.今天我们就讲解其中的一个方面,用Python调用Shell命 ...

  8. C语言函数怎么像python那样返回多个值?(三种方法:1、设置全局变量 2、传递指针 3、使用结构体返回不同类型的数据)

    引用文章:c语言函数可不可以返回多个值 文章目录 方法一:设置全局变量 例如:利用一个函数求出正方形的周长和面积. 方法二:使用数组名或指针作为函数的形参 实例2:编写函数求一维整形数组的最大值与最小 ...

  9. 如何编写有多个返回值的C语言函数

    1引言 笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样 ...

最新文章

  1. linux应用程序跑飞,linux 试题
  2. 复现网状的记忆Transformer图像描述模型(失败)
  3. Golang的time包:秒、毫秒、纳秒时间戳输出
  4. HDOJ 1298 T9(trie树简单应用)
  5. missforest_missforest最佳丢失数据插补算法
  6. 10、并发容器,ConcurrentHashMap
  7. ionic 旅途-- 一起来填坑
  8. sql server 常用语句
  9. java代码 创建文件夹的方法
  10. 如何用word制作英语答题卡_英语考试答题卡(word 版)
  11. git删除多余的tracked文件(git提示ignored tracked with git)
  12. 用计算机怎么计算税率,一般纳税人税率计算器,一般纳税人税率如何计算?
  13. 小程序全局悬浮窗_微信小程序中悬浮窗功能的实现代码
  14. 人工成本上升?设备停机率高?制造企业该如何破而后立?
  15. 实用的网址(chrome官方离线安装包,chrome插件、 Google play apk下载等等 )
  16. C# wpf 自定义标题栏及无边框窗口
  17. CDUTCM OJ 2017第一次月赛
  18. Paypal学习 3 -- 接受信用卡直接付款 (DoDirectPayment)
  19. java程序设计实践教程张永常_java程序设计实用教程
  20. 云服务器上通过wget安装JDK

热门文章

  1. 将Java Flight Recorder与OpenJDK 11结合使用
  2. 使用Dagger 2在GWT中进行依赖注入
  3. 远程调用 quartz_如何远程管理Quartz
  4. Mule ESB,ActiveMQ和DLQ
  5. Java:逐步读取/流式传输CSV文件
  6. Java自动拆箱陷阱。 谨防!
  7. 简单性与鲁棒性–在锁定文件处理中展示
  8. 振作起来– Spring Framework 4.0即将来临!
  9. 具有Aspects的Java中的Mixin –用于Scala特性示例
  10. 泽西岛的JSON模式生成