得恶补编译原理了, false == isShown 和 isShown == false 的区别 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Registering
V2EX    程序员

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

  •  
  •   Registering 2015-01-24 17:30:55 +08:00 6335 次点击
    这是一个创建于 3923 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有点小疑问

    false == isShown 和 isShown == false

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

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


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

    求解答
    第 1 条附言    2015-01-24 20:40:05 +08:00
    答案:Yoda Notation
    41 条回复    2015-01-26 15:04:45 +08:00
    zx120120
        1
    zx120120  
       2015-01-24 17:33:02 +08:00   6
    效率上是没有区别的。
    写成 false == isShown 是为了在手抖写成 false = isShown 的时候让编译器报个错。
    用 isShown == false 手抖变成 isShown = false 的时候找半天都找不到
    recall704
        2
    recall704  
       2015-01-24 17:35:23 +08:00
    同意楼上,这个应该不算编译原理的问题。
    而是一种编程技巧。
    Elethom
        3
    Elethom  
       2015-01-24 17:35:42 +08:00
    并有任何, 只是防止成 assignment 的人. 似 if...else 要加 braces.
    mulog
        4
    mulog  
       2015-01-24 17:36:24 +08:00
    @zx120120 说的没错
    不过很久之前似乎看到过一篇文章说不提倡这么写 理由。。忘了-_-
    anyway, 反正我大 Python 不需要这么写 Yay
    markyangd
        5
    markyangd  
       2015-01-24 17:39:11 +08:00
    @zx120120
    在我大微软的C#面前,这都不是个事。
    zxtasa
        6
    zxtasa  
       2015-01-24 17:47:01 +08:00
    gcc很久之前的版本就能报警告了
    omegaga
        7
    omegaga  
       2015-01-24 17:56:28 +08:00
    没有区别。
    这种写法叫做Yoda Notation,王垠老湿还专门写文章喷过,《Yoda表示法错在哪里》。
    hahastudio
        8
    hahastudio  
       2015-01-24 17:58:22 +08:00
    没有区别
    编译原理总是很旧的= =
    现在你能想到的人肉优化方式,编译器都已经自动做了= =
    Registering
        9
    Registering  
    OP
       2015-01-24 18:00:46 +08:00
    @omegaga

    记得王垠老湿还专门撰文喷过i++这种写法
    gamecreating
        10
    gamecreating  
       2015-01-24 18:03:00 +08:00
    LZ逗
    chrishine
        11
    chrishine  
       2015-01-24 18:26:17 +08:00
    削足适履的东西还能被称为优秀...
    xbb7766
        12
    xbb7766  
       2015-01-24 18:49:03 +08:00
    这么写感觉更混乱。
    总不见得一直手抖,把==打成=,又不是帕金森。
    况且会“手抖写错”的也不只有这个,比如php的==和===
    acros
        13
    acros  
       2015-01-24 18:51:19 +08:00
    如果你一个失误写出了 if(isShown = false)
    现在的编译器都会报出个warnning提醒你的
    timothyye
        14
    timothyye  
       2015-01-24 19:07:34 +08:00 via Android
    一楼正解
    FrankFang128
        15
    FrankFang128  
       2015-01-24 19:15:58 +08:00 via Android
    无聊的trick
    juicy
        16
    juicy  
       2015-01-24 19:19:20 +08:00
    不管这么写是不是值得喷,至少浏览器里的js编译器还没有支持检查这种错误,所以js里这么写是提倡的咯~
    husinhu
        17
    husinhu  
       2015-01-24 19:25:04 +08:00
    1. 这跟编译原理没关系,这句话编译后也就一个cmp,甚至平台支持情况下,如arm,cmp都没有,只是附庸在汇编指令后的条件码。
    2. “很多优秀的blabla” 也是扯淡,事实上如果你看过一些牛逼的开源项目,看看人家的coding convention,一般都会明确说写这种语句的时候都用后面一种。
    chuan
        18
    chuan  
       2015-01-24 19:25:18 +08:00
    为了避免手误,和正常思维相逆,不太赞同这种写法
    BGLL
        19
    BGLL  
       2015-01-24 19:26:30 +08:00
    这种避免犯错方法还是很有用的,所以那么多优秀的项目才都用这种方法
    Xrong
        20
    Xrong  
       2015-01-24 19:29:27 +08:00
    比较不喜欢这种写法,感觉太变态了点...
    cty
        21
    cty  
       2015-01-24 19:37:25 +08:00
    两种写法在机器语言上没有区别。如果你说的是抽象语法树或者三地址码的话,应该只有顺序上的区别。

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

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

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

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

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

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

    在不存在等号表达式(大部分比较新的语言)里都没有这么写的必要,因为赋值表达式不返回值,因此写错了一定会报错的。
    skx926
        33
    skx926  
       2015-01-25 13:03:01 +08:00 via iPhone
    @acros 同意
    winiex
        34
    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
        35
    omegaga  
       2015-01-25 21:38:19 +08:00 via Android
    @winiex wiki上写了啊,also called Yoda Notation…
    winiex
        36
    winiex  
       2015-01-25 22:24:05 +08:00
    @omegaga 失察了,之前自己一直都是这么叫,抱歉。
    air20
        37
    air20  
       2015-01-26 03:20:12 +08:00
    为啥要 if ( isShown == false )
    直接 if( !isShown ) 不就好了
    Registering
        38
    Registering  
    OP
       2015-01-26 09:51:27 +08:00
    @air20 有时Yoda Notation 还可能是 if(null == person)
    Registering
        39
    Registering  
    OP
       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
        40
    pheyer  
       2015-01-26 11:27:17 +08:00
    就是一种防御性编程技巧吧,无它
    robertlyc
        41
    robertlyc  
       2015-01-26 15:04:45 +08:00
    随着编译器的改进 上古时代的技巧 已经显得过时了

    更可怕的是 抱残守缺的思想 凡是祖上流传下来的 不管对不对 就一定要坚持
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     957 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:33 PVG 03:33 LAX 12:33 JFK 15:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86