免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

对于返回值是0或1的,使用哪种判断方式? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2008-06-24 15:55 |只看该作者
原帖由 dinghwy 于 2008-6-24 15:44 发表

我喜欢用!,不过即使你函数返回null 你用if(!null)不就是表示执行返回null这个值的操作了吗?这样理解很容易,也很直观。


正是!试问有谁关心过那个非null的具体值?我只关心“值是否有效”,而不关心“有效值是几”。
看似一个多值判断,实际上是个二值判断,或者不如说是逻辑判断。Linux内核的这种写法让人一目了然,力挺之。

论坛徽章:
0
42 [报告]
发表于 2008-06-24 17:16 |只看该作者
原帖由 Godbach 于 2008-6-21 12:06 发表
呵呵,了解一下那种方式更常用。
int func(), 返回值为0或1.

当调用该函数,判断其返回值为0时:
if(func() == 0)

if(!func())
大家更常用哪一种?

只有两种返回值的情况下我会写成
  1. bool func()
复制代码

用 if (! func())

论坛徽章:
0
43 [报告]
发表于 2008-06-25 09:08 |只看该作者

回复 #41 Wind-Son 的帖子

if (!ret)
and
if  (ret == 0)
个人觉得第一是一种习惯,第二就是效率的问题。

if(!ret) 在编译成汇编的话,效率必然比第二种高。 第一种汇编成取非操作专门有这样的指令,第二种是比较操作。或许这就是大家经常在内核代码中看到的原因吧。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
44 [报告]
发表于 2008-06-25 10:35 |只看该作者
原帖由 dwh0403 于 2008-6-25 09:08 发表
if (!ret)
and
if  (ret == 0)
个人觉得第一是一种习惯,第二就是效率的问题。

if(!ret) 在编译成汇编的话,效率必然比第二种高。 第一种汇编成取非操作专门有这样的指令,第二种是比较操作。或许这就是 ...


呵呵,看来应该看一下汇编的情况。

论坛徽章:
0
45 [报告]
发表于 2008-06-25 17:35 |只看该作者
在这里纠缠效率的问题,显然不合适

这样使用的效率差异有影响吗?

论坛徽章:
0
46 [报告]
发表于 2008-06-25 20:49 |只看该作者
原帖由 Godbach 于 6-21-2008 22:51 发表


呵呵,这种方法为了防止比较时少写一个“=”。不过很多人多说这是奇技淫巧。


你说的这种情况是对变量的判断,函数返回值判断不存在这个问题。这不是奇技淫巧,是编程规范,呵呵。

论坛徽章:
0
47 [报告]
发表于 2008-06-25 20:59 |只看该作者
猜测一下,大多数编译器在这种情况下会做出优化,因此,在“执行”效率上等效

论坛徽章:
0
48 [报告]
发表于 2008-07-01 17:42 |只看该作者
喜欢前者。清晰 明白

论坛徽章:
0
49 [报告]
发表于 2008-07-02 01:32 |只看该作者
原帖由 leesnow1 于 2008-6-23 18:34 发表
如果要考虑移植性  最好这样判断

整数
if ( x == 0 )

浮点
if ( x == 0.0 )

bool , 指针
if ( x )   if ( !x )

char
if ( x=='\0' )

比较浮点数最好不要用 "==" .  

判断返回值, 我们一般用
iRet = func(xxx);
if (iRet < 0)
{
    ...;
}
(默认规则:  小于0, 错误; 等于 0, 正确

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
50 [报告]
发表于 2008-07-02 09:36 |只看该作者
原帖由 libin1983 于 2008-7-2 01:32 发表

比较浮点数最好不要用 "==" .  

判断返回值, 我们一般用
iRet = func(xxx);
if (iRet < 0)
{
    ...;
}
(默认规则:  小于0, 错误; 等于 0, 正确


对,在内核中这种方式也比较多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP