C语言当函数执行成功时return1还是0

目录
  • 1、C语言函数的返回值
  • 2、“行业潜规则”
  • 3、函数成功只有一种可能,函数失败却有多种可能
  • 4、C语言程序员中还有一种“行业潜规则”
  • 5、最后

今天分享的内容是关于函数执行成功,返回0还是1的讨论~

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

不同的输入,常常产生不同的输出结果。

1、C语言函数的返回值

C语言函数可以通过返回值表示输出结果,例如 log() 函数的返回值会根据不同的输入,返回不同的值。

再比如,我们定义一个函数 myopen(),用于打开某个文件,那么,这个函数要么能够成功打开文件,要么打开文件失败,这时,可以通过返回值区分“成功”和“失败”。

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

2、“行业潜规则”

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

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

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

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

3、函数成功只有一种可能,函数失败却有多种可能

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

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

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

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

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

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

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

5、最后

本文主要讨论了C语言程序开发中关于函数返回值的问题。可见,使用什么样的返回值表示成功,什么用的返回值表示失败,其实只是一种人为约定。

只不过,如果希望我们编写的代码能够被大多数同行愉快的使用,最好遵守下“行业潜规则”。

当然了,若是希望我们的C语言代码应用性更广,则可以使用<stdlib.h>标准头文件里预先定义好的 EXIT_SUCCESS 和 EXIT_FAILURE 宏。

到此这篇关于C语言当函数执行成功时return1还是0的文章就介绍到这了,更多相关C语言函数执行return内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Linux系统中C语言编程创建函数fork()执行解析

    最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解.现总结如下: 1.函数本身 (1)头文件 #include<unistd.h> #include<sys/types.h> (2)函数原型 pid_t fork( void); (pid_t 是一个宏定义,其实质是int 被定义在#include<sys/types.h>中) 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID:否则,出错返回-1 (3)函数说明 一

  • C语言中怎么在main函数开始前执行函数

    在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下: 复制代码 代码如下: #include <stdio.h> __attribute((constructor)) void before_main(){ printf("%s/n",__FUNCTION__);} __attribute((destructor)) void after_main(){ printf("%s/n",__FUNCTIO

  • 对比C语言中execv相关的执行文件的三个函数

    C语言execv()函数:执行文件函数 头文件: #include <unistd.h> 定义函数: int execv (const char * path, char * const argv[]); 函数说明:execv()用来执行参数path 字符串所代表的文件路径, 与execl()不同的地方在于execve()只需两个参数, 第二个参数利用数组指针来传递给执行文件. 返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中. 错误代码:请参考 ex

  • C语言当函数执行成功时return1还是0

    目录 1.C语言函数的返回值 2."行业潜规则" 3.函数成功只有一种可能,函数失败却有多种可能 4.C语言程序员中还有一种"行业潜规则" 5.最后 今天分享的内容是关于函数执行成功,返回0还是1的讨论~ 基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常常产生不同的输出结果. 不同的输入,常常

  • PHP中如何判断exec函数执行成功?

    前言 做一个代码发布的系统,需要用到PHP的exec函数来执行Linux下的命令和git,svn命令,如何判断PHP的exec函数是否执行成功呢? 解决方案 写个PHP文件来做实验: exec函数第一个参数是执行的命令,第二个参数是执行的结果,第三个参数是执行的状态. <?php exec('ls', $log, $status); print_r($log); print_r($status); echo PHP_EOL; 执行这个php文件: 这里$log,$status输出结果如图. 但是

  • c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道. 1.关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes); 头文件: #include<malloc.h>或者#include<alloc.h>两者的内容是完全一样的 如果分配成功:则返回指向被分配内存空间的指针 不

  • C语言 pthread_create() 函数讲解

    pthread_create()函数详解 pthread_create是类Unix操作系统(Unix.Linux.Mac OS X等)的创建线程的函数.它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数. 头文件: #include<pthread.h> 函数原型: int pthread_create (pthread_t * tidp, const pthread_attr_t * attr, void * (*start_rtn)(voi

  • Go语言学习函数+结构体+方法+接口

    目录 1. 函数 1.1 函数返回值 同一种类型返回值 带变量名的返回值 函数中的参数传递 函数变量 1.2 匿名函数——没有函数名字的函数 在定义时调用匿名函数 将匿名函数赋值给变量 匿名函数用作回调函数 可变参数——参数数量不固定的函数形式 1.3 闭包 1.4 defer语句 处理运行时发生的错误 1.5 宕机恢复(recover)——防止程序崩溃 2. 结构体 2.1 定义与给结构体赋值 3. 方法 3.1 结构体方法 3.2 接收器 指针接收器 非指针类型接收器 4. 接口 4.1 声

  • GO语言延迟函数defer用法分析

    本文实例讲述了GO语言延迟函数defer用法.分享给大家供大家参考.具体分析如下: defer 在声明时不会立即执行,而是在函数 return 后,再按照 FILO (先进后出)的原则依次执行每一个 defer,一般用于异常处理.释放资源.清理数据.记录日志等.这有点像面向对象语言的析构函数,优雅又简洁,是 Golang 的亮点之一. 代码1:了解 defer 的执行顺序 复制代码 代码如下: package main import "fmt" func fn(n int) int {

  • 基于C语言sprintf函数的深入理解

    printf 可能是许多程序员在开始学习C语言时接触到的 第二个函数(我猜第一个是main),说起来,自然是老朋友了,可是,你对这个老朋友了解多吗?你对它的那个孪生兄弟sprintf了解多吗?在将各种类 型的数据构造成字符串时,sprintf的强大功能很少会让你失望.由于sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致sprintf比printf有用得多.所以本文着重介绍sprintf,有时也穿插着用用 pritnf.

  • C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数:改变或增加环境变量 头文件: #include4<stdlib.h> 定义函数: int putenv(const char * string); 函数说明:putenv()用来改变或增加环境变量的内容. 参数string 的格式为name=value, 如果该环境变量原先存在, 则变量内容会依参数string 改变, 否则此参数内容会成为新的环境变量. 返回值:执行成功则返回0, 有错误发生则返回-1. 错误代码:ENOMEM 内存不足, 无法配置新的环境变量空间

  • 浅谈Linux环境下并发编程中C语言fork()函数的使用

    由fork创建的新进程被称为子进程(child process).fork函数被调用一次,但返回两次.子进程的返回值是0,而父进程的返回值则是新进程的进程ID.将子进程ID返回给父进程的理由是:因为一个进程的子进程可以有多个,并且没有一个函数使一个进程可以获得其所有子进程的进程ID.fork使子进程得到返回值0的理由是:一个进程只会有一个父进程,所以子进程总是可以调用getpid以获得其父进程的进程ID. 使fork失败的两个主要原因是:系统中已经有了太多的进程,或者该实际用户ID的进程总数超过

  • 老生常谈C语言动态函数库的制作和使用(推荐)

    >>>>>>老生常谈C语言接静态函数库的制作和使用>>点击进入 2 动态函数库的制作和使用 动态函数库的制作步骤可以用下图来描述,具体包括 (1) 编写函数的.c文件(例如add.c.sub.c.mul.c和div.c) (2) 编写Makefile,然后make,实现函数的编译和归档入库 函数的编译:使用gcc –c add.c -fPIC只编译不链接函数.c文件,分别生成函数的目标文件(例如add.o.sub.o.mul.o和div.o). 函数的归档入

随机推荐