V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
guorui112
V2EX  ›  问与答

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

  •  
  •   guorui112 · Oct 11, 2019 · 4187 views
    This topic created in 2394 days ago, the information mentioned may be changed or developed.
    27 replies    2019-10-12 14:54:57 +08:00
    daguaochengtang
        1
    daguaochengtang  
       Oct 11, 2019
    没看懂你说的什么意思
    ClericPy
        2
    ClericPy  
       Oct 11, 2019
    听说是 Clang 的遗留梗
    zhs227
        3
    zhs227  
       Oct 11, 2019   ❤️ 7
    怕你把==写成=号了,这种错误判断不出来。如果把常量写在前面就不存在问题。
    例:a ==3 写成 a =3
    对比: 3 == a 写成了 3=a

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

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

    此外这个规范没啥意义

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

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

    @ultimate Pascal 比较就是用“=”,而赋值语句是“:=”,没有“==”语法。
    gIrl1990
        27
    gIrl1990  
       Oct 12, 2019
    @zhs227 #3 两个变量的比较怎么办? 233 a==b a=b
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2436 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 05:10 · PVG 13:10 · LAX 22:10 · JFK 01:10
    ♥ Do have faith in what you're doing.