0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言函数返回1和返回0到底哪个好?

strongerHuang 来源:CSDN技术社区 作者:wyh15895833492 2021-04-22 09:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

C语言代码的组合千变万化,因此函数的功能可能会比较复杂,不同的输入,常常产生不同的输出结果。

1C语言函数的返回值

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

当然,myopen() 函数失败的原因可能很多,但不是本文关注的重点,本文更关心的是,该以何值表示“成功”,何值表示“失败”。

按照C语言语法, 0 表示假,非零(常常用 1)表示真,那是否函数也用 0 返回值表示“失败”,1 返回值表示“成功”呢?

2行业“潜规则”

C语言函数当然可以使用返回值 0 表示“失败”,用返回值 1 表示“成功”。

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

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

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

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

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

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

3C语言程序员中另一中行业“潜规则”

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

if( is_true() ) printf(“true

”);

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

4小结

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

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

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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7644

    浏览量

    145658
  • 函数
    +关注

    关注

    3

    文章

    4417

    浏览量

    67560
  • 程序员
    +关注

    关注

    4

    文章

    956

    浏览量

    30946

原文标题:C语言函数返回1和返回0究竟哪个好?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在Keil中进行C代码与汇编代码的混合编程

    : LOOP_END MOV R8,lr; 保存起来 lr BL dummy; 调用了 C 语言中的函数 MOV lr,R8 ; 复原 lr MOV R0,#12 ; R
    发表于 01-23 06:36

    C语言函数指针的六个高级的应用场景

    元素传递给指定的函数,然后将函数返回值存储回原数组中。 在 main 函数中,我们定义了一个 increment 函数,它将传入的整数加
    发表于 01-04 12:25

    C语言回调函数原来这么简单

    ” 这个概念,它是回调函数能够实现的重要基础。 1函数指针学习过C语言的伙伴都知道,C
    发表于 12-30 06:45

    C语言中实现函数宏的三种方式

    (0) 不同的是,({}) 不能提前退出函数宏与支持返回值。({}) 毕竟不是 while 循环,不能直接使用 break退出函数宏是比较容易理解。那支持
    发表于 12-29 07:34

    如何用好 C 语言函数返回值?

    的重点,本文更关心的是,该以何值表示“成功”,何值表示“失败”。 按照C语言语法, 0 表示假,非零(常常用 1)表示真,那是否函数也用
    发表于 12-25 07:17

    C语言C++的区别及联系

    创建源文件时什么都不给,默认是.cpp。 3、返回C语言中,如果一个函数没有指定返回值类型,默认
    发表于 12-24 07:23

    CAN被动错误恢复后为什么rt_device_write还会返回异常呢?

    1、系统启动,给CAN总线发送数据,总线设备通讯正常 2、制造总线错误,当总线设备错误帧达到128之后,总线进入被动错误,总线数据发送失败,rt_device_write函数返回0 3
    发表于 12-22 16:29

    检查函数返回值的错误和异常处理方法

    检查函数返回值:这是最常见也最基本的错误处理和异常处理方法,就是在调用一个函数后,检查其返回值是否符合预期或是否表示出错或失败。如果出错或失败,则根据
    发表于 12-11 06:48

    Stack栈到底用来干嘛的呢?

    Stack_Size就是栈大小,0x00000400就是代表有1K(0x400/1024)的大小。 那这个栈到底用来干嘛的呢? 比如说我们函数
    发表于 12-01 08:04

    飞凌嵌入式ElfBoard-文件I/O的了解探究之返回错误处理与相关函数

    errno仅返回数值,还需查阅错误宏定义才能知道具体错误原因,由此引入以下两个标准c函数。perror用于在发生系统调用错误时输出有关错误信息的描述。当一个系统调用或库函数发生错误时
    发表于 11-21 08:50

    如何获得速卖通aliexpress分类详情 API 返回值说明

    的API返回值会取决于你使用的API版本和请求类型。 以下是一个假设性的速卖通分类详情API返回值的说明,但请注意,这并非实际的API返回结构,因为速卖通的具体API文档可能不为公众公开。在实际开发中,你应当查阅速卖通官方的AP
    的头像 发表于 11-09 17:46 1136次阅读

    把qspi0配置成了普通的fifo模式,读什么都返回0xff,这是怎么回事?

    我把qspi0配置成了普通的fifo模式,不是xip模式,但是现在读什么都返回0xff,读id也返回0xff,也不是没有数据,RXDATA寄
    发表于 11-06 06:57

    蜂鸟E203的GPIO读取的返回值注意事项

    GPIOB的0号端口返回值是1,读取GPIOB的1号端口返回值是2,读取GPIOB的2号端口返回
    发表于 10-22 08:05

    调用Cy_ReadFuseByte()函数返回0xF0000005是怎么回事?

    。 当我们调用 Cy_ReadFuseByte() 函数时,返回的是 0xF0000005(熔断 eFuse 的软件流程中的第 5 步) 遵循架构参考手册和数据表: “在过渡到安全或带调试的安全
    发表于 07-24 07:08

    请问CY68013上位机发送的返回到底代表什么意思?

    ,为0时代表发送失败,刚开始一直没问题,FPGA端接收也正常,上位机返回值也是1, 最后返回值一直是0,所以我一直认为发送失败了,但是今天在
    发表于 05-22 07:16