V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
voidmnwzp
V2EX  ›  程序员

一个有意思的现象: 关于逻辑运算符的求值顺序

  •  
  •   voidmnwzp ·
    NullpointerW · 2023-08-23 20:51:55 +08:00 · 774 次点击
    这是一个创建于 457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://go.dev/play/p/BrcEX_1Nu3D
    求值顺序应该先求出 a,然后调用 alterA(&a)返回 a 的指针取地址求值再进行比较,但看起来是执行完 alterA(&a)函数后,再对 a 求值,所以打印出了"oh,righ"

    lesismal
        1
    lesismal  
       2023-08-23 23:56:12 +08:00
    表达式里含有子表达式这种,通常是要先计算子表达式吧,如果多个子表达式、c 里好像是不规定多个子表达式的先后顺序而是依赖编译器厂商实现。
    go 的表达式规则我没细看,但是 OP 这段代码如果按照先计算子表达式,并且编译器推断那就是对比 a==a ,所以编译器直接可以优化了,看下反汇编的代码就优化掉了的:
    https://gist.github.com/lesismal/71a96904de3a878c6ff27dd36e8fd4af
    voidmnwzp
        2
    voidmnwzp  
    OP
       2023-08-24 03:15:59 +08:00 via iPhone
    @lesismal 这是被编译器优化到只往 ax 里面放了个 4 吗 ,还挺智能的,c 我也试过,结果也是一样的
    lesismal
        3
    lesismal  
       2023-08-24 09:57:43 +08:00
    @voidmnwzp 是的。go 和 c 的编译器还不是特别智能,如果是 cpp 编译器、很多不这么明显的逻辑也会优化得更屌
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2581 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 10:46 · PVG 18:46 · LAX 02:46 · JFK 05:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.