为什么很多人推荐 null == obj 或者 "value" == key 不推荐 obj == null key == "value" 的写法

2019-10-11 10:56:26 +08:00
 guorui112
3620 次点击
所在节点    问与答
27 条回复
daguaochengtang
2019-10-11 10:59:48 +08:00
没看懂你说的什么意思
ClericPy
2019-10-11 11:00:45 +08:00
听说是 Clang 的遗留梗
zhs227
2019-10-11 11:02:13 +08:00
怕你把==写成=号了,这种错误判断不出来。如果把常量写在前面就不存在问题。
例:a ==3 写成 a =3
对比: 3 == a 写成了 3=a

if (a=3) { dosomething();}
上面的语句在很多语言里是真值。
shintendo
2019-10-11 11:03:08 +08:00
通常的解释是:前面的写法当你不小心把==写成=的时候能直接报错
虽然我觉得挺扯的……
saeed
2019-10-11 11:03:12 +08:00
防止 少写 个等号 成了赋值吧
littleylv
2019-10-11 11:03:34 +08:00
3 楼是正解,结贴。
HENQIGUAI
2019-10-11 11:13:30 +08:00
默认 java;
直接比较这玩意的顺序主要看个人习惯;
不像是
varible.equals("aaa");

"aaa".equals(varible);
这种推荐字面量在前是因为你变量值有可能为 null , 再去调用方法就会 NPE 了;
另外,StringUtils 不香吗
lyh404
2019-10-11 11:20:11 +08:00
以前写 C 时,部门编程规范强制要求一定要把值写在左边,就是为了防止少写等号出问题。
zek
2019-10-11 11:36:39 +08:00
Java 是为了避免空指针异常
Mithril
2019-10-11 11:48:54 +08:00
最开始的时候是 C 语言推荐这么做,记得最早是 C 专家编程或者 C 陷阱与缺陷书里写的。
这两本书都非常老了,上古时代的 C 编译器无法在你把条件语句写成赋值语句时给出警告。但是如果你这么倒着写,赋值语句就会直接出错。
但现在几乎所有编译器都可以在这种情况下给出警告,这么写已经没什么用了。而且如果代码一部分这么写,一部分正着写,看起来就很怪,还不如全正着写。
szandy6
2019-10-11 11:51:23 +08:00
主要看语言,如果是 js 为了防出错可以把 null 写前面,java 或 C#我觉得没必要,因为判断条件写成赋值编译时就报错了,obj==null 这样读起来更顺,更符合直觉。
lagoon
2019-10-11 12:00:16 +08:00
其实有点讨厌这种提倡。
因为老的语言有这种习惯,就强迫新的语言,明明没有必要还那么写。
类似的情况还有很多。
算不算老码农的霸权主义?
passerbytiny
2019-10-11 12:03:19 +08:00
因为这种推荐写法出来的时候 Java 还不流行,Java 流行后无脑跟风的又太多。

if (obj = null) 等效于 if (null),null = obj 在哪个语言都会报错(编译错误或运行错误)。在 Java 出现之前,不管是强类型的 C、C++,还是其他弱类型的语言,if (null) 又等效于 if (false) 。以及必须说明的是,那时候还盛行“记事本编码”。if (obj == null) 一个不小心就变成了 if (false),还特别难定位。if (null == obj) 虽然也会一不小心,但它变成的是编译错误(或者运行错误),非常容易定位。 于是 null == obj 就变成了推荐(或者强制)的编码规范。

Java 对此进行了简化,if (null) 直接报错,如果编译时就能确定则还报成编译错误,而 Java 之后的其它语言和 hint 工具,大多都加入了 if(obj = null)的检测,因此目前该项规范已经不适用,应当让位于可读性,还是要写成 if (obj == null)。
marvinyyf
2019-10-11 12:19:38 +08:00
我们 java 没这个要求,jni 有要求 NULL 写前面
bumz
2019-10-11 12:28:00 +08:00
现代编译器都会检查
真想 if (a = 0) 得写成 if ((a = 0)) 才不会警告⚠️

此外这个规范没啥意义

if (a = b) 就查不出来
taotaodaddy
2019-10-11 12:33:37 +08:00
就是三楼说的,结帖
NoKey
2019-10-11 12:39:32 +08:00
以前某些语言的 ide 或者编译器之类的,不检查 a=null 在条件语句中的问题
现在很多语言的 ide 或者编译器支持了
所以现在有些人会觉得很奇怪
autoxbc
2019-10-11 13:04:58 +08:00
尤达表达式,已被废弃

容易写错的表达式总有办法避免写错
不合语义的表达式永远都不合语义
starcraft
2019-10-11 13:31:27 +08:00
确实应该算 java 发扬的,开源大项目全是这样的写法。
mxalbert1996
2019-10-11 14:08:13 +08:00
反正我是 == 写习惯了反而写 SQL 的时候有时会写写错

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

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

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

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

© 2021 V2EX