首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
V2EX  ›  问与答

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

  •  
  •   guorui112 · 32 天前 · 2052 次点击
    这是一个创建于 32 天前的主题,其中的信息可能已经有所发展或是发生改变。
    27 回复  |  直到 2019-10-12 14:54:57 +08:00
        1
    nikolausliu   32 天前
    没看懂你说的什么意思
        2
    ClericPy   32 天前
    听说是 Clang 的遗留梗
        3
    zhs227   32 天前   ♥ 7
    怕你把==写成=号了,这种错误判断不出来。如果把常量写在前面就不存在问题。
    例:a ==3 写成 a =3
    对比: 3 == a 写成了 3=a

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

    "aaa".equals(varible);
    这种推荐字面量在前是因为你变量值有可能为 null , 再去调用方法就会 NPE 了;
    另外,StringUtils 不香吗
        8
    lyh404   32 天前   ♥ 1
    以前写 C 时,部门编程规范强制要求一定要把值写在左边,就是为了防止少写等号出问题。
        9
    zek   32 天前 via iPhone
    Java 是为了避免空指针异常
        10
    Mithril   32 天前
    最开始的时候是 C 语言推荐这么做,记得最早是 C 专家编程或者 C 陷阱与缺陷书里写的。
    这两本书都非常老了,上古时代的 C 编译器无法在你把条件语句写成赋值语句时给出警告。但是如果你这么倒着写,赋值语句就会直接出错。
    但现在几乎所有编译器都可以在这种情况下给出警告,这么写已经没什么用了。而且如果代码一部分这么写,一部分正着写,看起来就很怪,还不如全正着写。
        11
    szandy6   32 天前
    主要看语言,如果是 js 为了防出错可以把 null 写前面,java 或 C#我觉得没必要,因为判断条件写成赋值编译时就报错了,obj==null 这样读起来更顺,更符合直觉。
        12
    lagoon   32 天前
    其实有点讨厌这种提倡。
    因为老的语言有这种习惯,就强迫新的语言,明明没有必要还那么写。
    类似的情况还有很多。
    算不算老码农的霸权主义?
        13
    passerbytiny   32 天前
    因为这种推荐写法出来的时候 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)。
        14
    marvinyyf   32 天前
    我们 java 没这个要求,jni 有要求 NULL 写前面
        15
    bumz   32 天前 via iPhone
    现代编译器都会检查
    真想 if (a = 0) 得写成 if ((a = 0)) 才不会警告⚠️

    此外这个规范没啥意义

    if (a = b) 就查不出来
        16
    taotaodaddy   32 天前 via Android
    就是三楼说的,结帖
        17
    NoKey   32 天前
    以前某些语言的 ide 或者编译器之类的,不检查 a=null 在条件语句中的问题
    现在很多语言的 ide 或者编译器支持了
    所以现在有些人会觉得很奇怪
        18
    autoxbc   32 天前
    尤达表达式,已被废弃

    容易写错的表达式总有办法避免写错
    不合语义的表达式永远都不合语义
        19
    starcraft   32 天前
    确实应该算 java 发扬的,开源大项目全是这样的写法。
        20
    mxalbert1996   32 天前 via Android
    反正我是 == 写习惯了反而写 SQL 的时候有时会写写错
        21
    eGlhb2Jhb2Jhbw   32 天前
    谁给你推荐这种写法你去问谁呗,看他能给你说出来个 123 不
        22
    yicong135   32 天前
    这应该是 c/c++ 里面比较推荐用法
        23
    zpm683   32 天前
    避免空指针异常+1
    大项目是这样的。
        24
    ultimate   32 天前
    三楼是正解,刚学 C 语言的时候,==会写成=,程序不报错,但逻辑不对啊。
    PS.听说是 Pascal 的遗留梗
        25
    akira   32 天前
    @ultimate pascal 没有 ==
        26
    DOLLOR   31 天前
    现在很多工具都能提示==错写=了,其实怎么写都无所谓。不过 a==0 反而更复合思维,已经不怎么提倡 0==a 这种写法了。

    @ultimate Pascal 比较就是用“=”,而赋值语句是“:=”,没有“==”语法。
        27
    gIrl1990   31 天前
    @zhs227 #3 两个变量的比较怎么办? 233 a==b a=b
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2713 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 31ms · UTC 12:31 · PVG 20:31 · LAX 04:31 · JFK 07:31
    ♥ Do have faith in what you're doing.