为啥函数返回值:常用0表示成功,-1表示出错

通过返回值表示函数运行状态,这种代码风格在没有异常机制的C语言中是常见做法。
而0表示成功,-1表示出错并不是唯一的方案。这只是其中一种而已。
『用-1表示出错,非负数表示成功』该风格是出自Unix的早期系统调用函数。比如open、write、read、fork、wait、select
所谓系统调用你可以简单理解成就是man手册第二页的函数,尽管这并不准确,其实这只能说是系统调用的wrapper函数。早期的系统调用函数,都是用-1表示错误状态,具体的错误码则放置在”全局“变量errno之中。对于成功状态的返回值呢?则不一定是0,因为很多时候成功需要一个更有意义的值,比如open成功要返回一个文件描述符。read、write要返回实际读写的字节数、fork要对父进程返子进程的pid,对子进程返回0。
当函数行为中不存在多种有意义的值的时候,就返回0即可。比如chown、raname、kill等。
这一时期,对于错误状态的返回值是固定的就是-1。但是对于成功状态则是非负数均可。依据实际情况,不必都是0。
后来。以POSIX的多线程函数为代表的函数有了新的返回值风格。
『用0表示成功,用非0值表示失败(可正、可负)』比如pthread_create等线程处理函数。这些函数都不使用errno来存储错误码。当然这并不是因为多线程读写errno会有问题。其实errno是线程安全的,因为它其实是thread-local的变量。
顺便一提,即便是在拥有异常机制的C++中,很多编码规范也不鼓励使用异常。比如谷歌的C++编码规范:
6. 其他 C++ 特性 - Google 开源项目风格指南C++的异常比之Java还是有些不同,如果你在C++中使用了异常,那么所有上游的调用栈,你都需要小心点捕获异常,即使没捕获也不影响编译,但稍有遗漏得不偿失。所以很多情况下不鼓励使用异常,仅在使用到第三方库的时候,捕获异常,但从不主动抛出异常。这时,用0和-1来表示函数的运行状态在C++中也便有了用武之地。
当然关于C++是否鼓励使用异常是个见仁见智的问题,没有定论。这里不做展开讨论。


■网友
这应该是一个约定吧,没啥要讲的,如果真要讲,还是有点意思的。
首先,成功的状态只有一个,用任何数字表示都可以。用0表示最好,数字就分为0和非0.
只要运行的结果不是0,是一个负数,表示运行失败,非常方便。
程序运行错误,可能有很多种原因,使用非零的负数表示。
-1表示xx错
-2表示xx错
....


■网友
有一部分原因是为了返回值的表示方式统一,很大一部分函数返回正值和0,此时只能用负数表失败。但有些函数只有执行成功和失败,为了和前者兼容,用0表成功,用-1表失败,否则就会大混乱了,毕竟c没有布尔机制,无法直观看出函数返回值区间。
■网友
函数的返回值可以理解成一个计数。
电脑里的所谓“逻辑”实际是对信号组合的人为“注释”。
比如我想要让电脑执行一个任务,我事先想到了10种任务失败的可能,分别用电脑中编号为0-9的信号来表示结果是哪种失败。假设各种失败的情形不会同时出现2种及以上,那么任务执行的结果就有可能是编号为0-9的信号的其中一种为“开”,其他为“关”的10种结果和所有10个信号都为“关”的结果。外加任务执行中停电了这样的意料之外的“异常”。
那么我就可以通过进行如下判断来指导任务的执行结果是什么:
任务执行过程中是否发生外来因素的干扰?是=发生异常,否=执行结果是可靠的0-9的信号是否有“开”的状态? 是=因***执行失败,否=执行成功从上面的判断条件可以看出判断执行成功的条件因为只有一种可能所以最为简单,只要0-9的信号中状态为“开”的信号的数量为0就可以判断任务执行成功了。
所以如果我们 定义 执行成功=发生错误的个数为0
那么 执行失败=非执行成功 就是0以外的所有数


推荐阅读