得恶补编译原理了, false == isShown 和 isShown == false 的区别

2015-01-24 17:30:55 +08:00
 Registering
有点小疑问

false == isShown 和 isShown == false

这两个语句效率上有何区别???,,,,

很多优秀的项目基本不会用后者这种语句,,,,


编译原理学的确实不好,得恶补了,,,,,,,,

求解答
5927 次点击
所在节点    程序员
41 条回复
cty
2015-01-24 19:37:25 +08:00
两种写法在机器语言上没有区别。如果你说的是抽象语法树或者三地址码的话,应该只有顺序上的区别。

执行效率完全一样。
kneep
2015-01-24 20:51:18 +08:00
相反,我认为优秀的项目都不会用前者。并且根据我的观察,部门内喜欢用前者的都是些半吊子程序员,优秀的都喜欢后者,简单易读,符合自然语言的逻辑和直觉。
hitsmaxft
2015-01-24 21:43:49 +08:00
早期 x == false 很容易不小心写成 x=false 导致永远为 true

现在编译器会检查不说, ide 也会检查, 各种语言对应的代码质量工具也会检查, 这个规则显得有些落后。

然而,定这中规矩,无非是为了规避低质量代码,用简单规则+惩罚来提高整体代码质量。毕竟人的能力有差别。在没有工具支持的时候, 用一个简单的命令式规则, 更加简单高效,比如工具检查出来的 warning 没修复, 那么判断不合格代码,禁止提交。

所以,首先得开发者愿意关心这些『异常』, 并且敏锐地觉察到代码的质量问题,并且修复这些「warning」。也就是高质量的开发者不需要这类小把戏 , 他们善于使用工具解决, 而不是人肉。

最后, 你也说了, 是『优秀』的项目。这类项目的开发者不屑于这些写, 大部分人完成的大部分项目是配不上『优秀』这两个字的。
churchmice
2015-01-24 21:50:13 +08:00
LZ真正需要的是补脑
spacewander
2015-01-24 21:52:12 +08:00
为什么我见过的绝大多数项目都是后一种写法……是因为我见过的项目都不够优秀么?
9hills
2015-01-24 22:03:19 +08:00
写前一种的,Code Review绝对不许过,回家治好病再来上班
inevermore
2015-01-24 22:11:31 +08:00
这年头早就不需要第一种了吧。。
Halry
2015-01-24 22:20:05 +08:00
没见过第一种地说
bcxx
2015-01-24 22:34:26 +08:00
本来写 false == isShown 就已经没意义了吧…… boolean 比较为啥不直接用 not 啊(not 的话还真的直接生成的(未优化)指令会少点……)
huangyanan
2015-01-24 23:11:57 +08:00
c c++ 这么写,原因主要是这个
int a = 5;
if (a = 6) {
cout<<a;
}
omegaga
2015-01-25 09:21:54 +08:00
@juicy 王垠老湿的意思是这是编程语言的错,而码农们却用一个更加反直觉的做法来修正,等于错上加错,该怎么解决这个问题呢?用王垠老师的Yin语言吧!(大雾…)

可是现实中总有些东西没办法说抛弃就抛弃,所以这不也是没有办法的办法嘛owo 几乎整本JavaScript: the Good Parts都充满了这种trick。要是王垠老湿看到了肯定喷出shit了
ant_sz
2015-01-25 12:21:34 +08:00
这种方法一般用在有等号表达式的C系列语言。这类语言里,赋值表达式也有返回值,因此有可能出现这种 == 写成 = 的bug。

在不存在等号表达式(大部分比较新的语言)里都没有这么写的必要,因为赋值表达式不返回值,因此写错了一定会报错的。
skx926
2015-01-25 13:03:01 +08:00
@acros 同意
winiex
2015-01-25 15:52:37 +08:00
如果说涉及到编译原理的知识的话,那就是有些现代编译器选项支持这个功能:当发现你在条件判断的地方使用了一个赋值语句时,它会给你一个 warning。

@omegaga 的表述不是太准确,这种做法应该叫 Yoda conditions:

http://en.wikipedia.org/wiki/Yoda_conditions

从代码表意上来看,Yoda conditions 是有问题的:

http://blog.codinghorror.com/new-programming-jargon/
omegaga
2015-01-25 21:38:19 +08:00
@winiex wiki上写了啊,also called Yoda Notation…
winiex
2015-01-25 22:24:05 +08:00
@omegaga 失察了,之前自己一直都是这么叫,抱歉。
air20
2015-01-26 03:20:12 +08:00
为啥要 if ( isShown == false )
直接 if( !isShown ) 不就好了
Registering
2015-01-26 09:51:27 +08:00
@air20 有时Yoda Notation 还可能是 if(null == person)
Registering
2015-01-26 09:52:57 +08:00
@omegaga
@winiex

In programming jargon, Yoda conditions (also called Yoda notation) is a programming style where the two parts of an expression are reversed from the ...
-------from wiki
pheyer
2015-01-26 11:27:17 +08:00
就是一种防御性编程技巧吧,无它

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/165070

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX