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

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

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

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

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

    此外这个规范没啥意义

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

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

    @ultimate Pascal 比较就是用“=”,而赋值语句是“:=”,没有“==”语法。
    gIrl1990
        27
    gIrl1990  
       2019-10-12 14:54:57 +08:00
    @zhs227 #3 两个变量的比较怎么办? 233 a==b a=b
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1062 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 19:07 · PVG 03:07 · LAX 12:07 · JFK 15:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.