免费注册 查看新帖 |

Chinaunix

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

[C] if(i == 0) 跟 if(!i) [复制链接]

论坛徽章:
0
41 [报告]
发表于 2009-01-20 20:55 |只看该作者
原帖由 251750675 于 2009-1-20 15:58 发表
if(!i)
不好的地方是   当i为负数的时候   也是真
if只是判断表达式  是为零或者不为零  而不是布尔符


顶,这个原因最值得注意

论坛徽章:
0
42 [报告]
发表于 2009-01-20 22:10 |只看该作者
原帖由 251750675 于 2009-1-20 15:58 发表
if(!i)
不好的地方是   当i为负数的时候   也是真
if只是判断表达式  是为零或者不为零  而不是布尔符


经试验,并没有出现这样的情况。
以下两段程序的执行效果相同。



  1. #include <stdio.h>

  2. int
  3. main(void)
  4. {
  5.         int i = -1;

  6.         if (!i)
  7.                 printf("Hell!  Sinky...\n");
  8.         printf("Living proof to show I'm alive.\n");

  9.         return 0;
  10. }
复制代码


  1. #include <stdio.h>

  2. int
  3. main(void)
  4. {
  5.         int i = -1;

  6.         if (i == 0)
  7.                 printf("Something went wrong...\n");
  8.         printf("Living proof to show I'm alive.\n");

  9.         return 0;
  10. }
复制代码

论坛徽章:
0
43 [报告]
发表于 2009-01-20 22:29 |只看该作者
3.6.4.1 The if-else statement

Constraints

   The controlling expression of an if statement shall have scalar type.  

Semantics

   In both forms, the first substatement is executed if the expression
compares unequal to 0.  In the else form, the second substatement is
executed if the expression compares equal to 0.  If the first
substatement is reached via a label, the second substatement is not
executed.

   An else is associated with the lexically immediately preceding else
-less if that is in the same block (but not in an enclosed block).


摘自 ANSI C X3.159-1989
由此可见,两种写法在逻辑上完全等价,因为都是在和 0 比较。

[ 本帖最后由 langue 于 2009-1-20 22:30 编辑 ]

论坛徽章:
0
44 [报告]
发表于 2009-01-20 23:25 |只看该作者
实践出真知.

论坛徽章:
0
45 [报告]
发表于 2009-01-21 08:42 |只看该作者
原帖由 samon_fu 于 2009-1-20 18:38 发表
0==i 这种方式,确实看起来很别扭,不过确实能够避免少写=号带来的bug。

i==0这种方式,代码可读性可能好点。

相信把i==0这种写成i=0的,大有人在,调试代码确实很头疼。

不过有个经验就是,发现 if( ...


其实将i==0写成i=0的情况并不多,而且在单元测试的时候基本马上就能发现并修正,比起 off by 1、buffer over flow等bug好查多了,
最重要的是,现在大部分编译器都会对 if( i = 0) 这样的语句给出warning的。
所以还是自然阅读的可读性更重要

论坛徽章:
0
46 [报告]
发表于 2009-01-21 11:44 |只看该作者
至于使用 !i 还是 i==0,要看个人的思考习惯。如果把 i 当成一个布尔运算的表达式,true或false,当然是用 !i 合适,如果仅仅把i当成是一个整数,那用 i==0 合适。不过在大多数这样的情况下, i 都是被当作一个true或false的开关来用的吧, 至于i到底等于几,谁在乎呢,所以用 !i 也是情理之中的。这两者的区别只不过是个人思维习惯的不同罢了。

论坛徽章:
0
47 [报告]
发表于 2009-01-21 12:28 |只看该作者
if( i == 0 ) 还是 if( !i ) 不重要,
只要不写  if( i == TRUE ) 这样愚蠢的代码就可以了

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-03 17:33:52数据库技术版块每日发帖之星
日期:2015-09-21 06:20:00
48 [报告]
发表于 2009-01-21 13:57 |只看该作者
不用考虑“=”号少写几个的问题,那是基础扎实不扎实的问题,要是粗心0=i照样会写上的。绝对支持i==0写法,另一种写法自己看代码时都容易搞错的。

论坛徽章:
0
49 [报告]
发表于 2009-01-21 14:38 |只看该作者
0=i 能compile ?

论坛徽章:
0
50 [报告]
发表于 2009-01-21 15:05 |只看该作者
if(0 == i)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP