• 请不要在回答技术问题时复制粘贴 AI 生成的内容
voidmnwzp
V2EX  ›  程序员

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

  •  
  •   voidmnwzp ·
    NullpointerW · Aug 23, 2023 · 1166 views
    This topic created in 1018 days ago, the information mentioned may be changed or developed.

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

    lesismal
        1
    lesismal  
       Aug 23, 2023
    表达式里含有子表达式这种,通常是要先计算子表达式吧,如果多个子表达式、c 里好像是不规定多个子表达式的先后顺序而是依赖编译器厂商实现。
    go 的表达式规则我没细看,但是 OP 这段代码如果按照先计算子表达式,并且编译器推断那就是对比 a==a ,所以编译器直接可以优化了,看下反汇编的代码就优化掉了的:
    https://gist.github.com/lesismal/71a96904de3a878c6ff27dd36e8fd4af
    voidmnwzp
        2
    voidmnwzp  
    OP
       Aug 24, 2023 via iPhone
    @lesismal 这是被编译器优化到只往 ax 里面放了个 4 吗 ,还挺智能的,c 我也试过,结果也是一样的
    lesismal
        3
    lesismal  
       Aug 24, 2023
    @voidmnwzp 是的。go 和 c 的编译器还不是特别智能,如果是 cpp 编译器、很多不这么明显的逻辑也会优化得更屌
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   890 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:31 · PVG 06:31 · LAX 15:31 · JFK 18:31
    ♥ Do have faith in what you're doing.