免费注册 查看新帖 |

Chinaunix

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

[C] 请教C编码问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-10-12 20:57 |只看该作者
C是最讲究效率的高级语言。if (a == true) 的效率不如if (a)(没有优化的话。)。

论坛徽章:
0
32 [报告]
发表于 2008-10-12 20:59 |只看该作者
原帖由 beepbug 于 2008-10-12 20:57 发表
C是最讲究效率的高级语言。if (a == true) 的效率不如if (a)(没有优化的话。)。

因为,按C的眼光看,if (a == true) 需要两步:
1)计算a == true;
2)判断计算结果是否为真。
而if (a) 只需要上面的第二步。

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2008-10-12 22:05 |只看该作者
原帖由 beepbug 于 2008-10-12 20:59 发表

因为,按C的眼光看,if (a == true) 需要两步:
1)计算a == true;
2)判断计算结果是否为真。
而if (a) 只需要上面的第二步。



我倒不这么觉得
在C里面 鼓励以 if (a != 0) 方式来取代 if(a) 来养成良好的编程习惯。
C里面慎用true/false,因为没有lib定义,自己enum的话也不过是

enum{
       false,
       true
}


这里如果值为 a =2 ,那么 if (a == true)意义就会变掉的

至于LZ的问题

if (a == 0)
     printf("False");


写法

(a!=0) || printf("False")


你仔细比一下if语句和 || 其实走的路径是一样子的,没必要太过计较,反而前一句可读性较好。

FYI

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
34 [报告]
发表于 2008-10-12 22:07 |只看该作者
原帖由 beepbug 于 2008-10-12 20:59 发表

因为,按C的眼光看,if (a == true) 需要两步:
1)计算a == true;
2)判断计算结果是否为真。
而if (a) 只需要上面的第二步。



程序的效率不是靠这个来提高的。

PS:我不是来吵架的。



楼主问的问题,嗯,很显然,多个if判断,代码可读性更好,而且不容易出错
你看你自己咯,把&&写成了||,一下子就引入一个BUG。

论坛徽章:
0
35 [报告]
发表于 2008-10-13 09:19 |只看该作者
c语言逻辑运算符的“短路”,据我所知,汇编后也是通过比较,跳转,比较,跳转的流程的。
所以那两种写法编译后没有效率上的差异。之所以没有第一种写法应该是习惯问题。

至于if(a == xx)还是if(a),哪个效率高不知道。但是c++中有bool带==号更直观。但是c中经常用int表示,判断为true还要写成if(a != 0),我觉得还是if(a)更直观些。

论坛徽章:
0
36 [报告]
发表于 2008-10-13 12:08 |只看该作者
that is good boy

论坛徽章:
0
37 [报告]
发表于 2008-10-13 13:08 |只看该作者
原帖由 dodolo0k 于 2008-10-10 22:32 发表
perl中有如下写法:(a == 1)|| printf("XXXXXXXXXXXX");

想问下C代码中怎么没有碰见过如上类似的写法?
该写法在C语法上来讲应该是对的。


比如:
if (a == true) {
     printf("a==ture");
}

...


应该是
a!=true || printf("XXX");

论坛徽章:
0
38 [报告]
发表于 2008-10-13 18:30 |只看该作者
对提高效率应该没什么帮助,反而影响了可读性

论坛徽章:
0
39 [报告]
发表于 2008-10-13 19:12 |只看该作者
首先,C不是Perl。
其次,C有太多的编译器实现。
最后,同一个C编译器,不同的编译选项,所编译出来的程序也不同。

在最普遍的情况下:
(a == 1)||printf("something");
编译器产生的代码,在||前面表达式为真的情况下,不去执行||后面的语句。但可以在编译的时候使用选项,改变这样的行为。

另外,
(a == 1)||printf("something");

if (a == 1)
    printf("something");
是不同的。

论坛徽章:
0
40 [报告]
发表于 2008-10-13 19:13 |只看该作者
所以,“我想知道为什么那么多开源代码里面没有这种写法”这根本就不是问题。没有那么多的为什么。不同的思想的结果必然不同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP