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

2023-08-23 20:51:55 +08:00
 voidmnwzp

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

771 次点击
所在节点    程序员
3 条回复
lesismal
2023-08-23 23:56:12 +08:00
表达式里含有子表达式这种,通常是要先计算子表达式吧,如果多个子表达式、c 里好像是不规定多个子表达式的先后顺序而是依赖编译器厂商实现。
go 的表达式规则我没细看,但是 OP 这段代码如果按照先计算子表达式,并且编译器推断那就是对比 a==a ,所以编译器直接可以优化了,看下反汇编的代码就优化掉了的:
https://gist.github.com/lesismal/71a96904de3a878c6ff27dd36e8fd4af
voidmnwzp
2023-08-24 03:15:59 +08:00
@lesismal 这是被编译器优化到只往 ax 里面放了个 4 吗 ,还挺智能的,c 我也试过,结果也是一样的
lesismal
2023-08-24 09:57:43 +08:00
@voidmnwzp 是的。go 和 c 的编译器还不是特别智能,如果是 cpp 编译器、很多不这么明显的逻辑也会优化得更屌

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX