"0 << 1 + 1"到底是等于 0 还是 1?

2022-01-06 08:23:16 +08:00
 MiketsuSmasher

昨天碰上这个问题,着实把我坑惨了,花了一个晚上搞明白,python 和 golang 按位移动运算符的优先级居然不一样

python:

print(0 << 1 + 1)

输出:0

golang:

import "fmt"

func main() {
    fmt.Println(0 << 1 + 1)
}

输出:1

4432 次点击
所在节点    程序员
37 条回复
littlewing
2022-01-06 11:48:31 +08:00
没必要纠结这种东西,啥,你说面试有人问?我反手就给他一巴掌
yangyaofei
2022-01-06 11:55:28 +08:00
这种的意义是啥, 就像 ++i+++=++i++, 没有任何意义
cmdOptionKana
2022-01-06 11:59:58 +08:00
@yazinnnn “嘲笑 lisp 括号罗嗦”本来就是菜鸟行为
yazinnnn
2022-01-06 12:02:14 +08:00
@cmdOptionKana 本站就不少。
mikewang
2022-01-06 12:03:20 +08:00
涉及到位运算的,还是都加上括号吧。位运算本身就不是非常优美,多加点括号啰嗦一下也没什么事。
ch2
2022-01-06 12:10:17 +08:00
不同语言运算符优先级不一样,位运算在 C 系里优先级很低的
acmore
2022-01-06 13:01:35 +08:00
遇事不决加括号,编程不仰赖记忆力
AoEiuV020CN
2022-01-06 13:12:04 +08:00
先乘除后加减,其他尽量都上括号,
crayygy
2022-01-06 14:41:35 +08:00
都说加括号,我不太一样,我宁可多用一个变量然后分两步写,位运算尽量分开,方便 debug
icenine
2022-01-06 15:17:49 +08:00
直接上括号,但凡你会一种以上的语言,深究这种语法细节有啥意义
cht
2022-01-06 15:46:16 +08:00
muzuiget
2022-01-06 15:46:45 +08:00
我不想,我直接加括号。
gengchun
2022-01-06 15:55:19 +08:00
@crayygy 这个看具体的代码类型。

如果是表示的是具体的业务,特别是现实中的商务订单处理这类,当然应该尽量分开。

如果是对一张照片里的每个图素都进行一次变换操作,这么写代价就太大了。
abersheeran
2022-01-06 23:32:08 +08:00
我从来不考虑这个。像 Index.py 的路由,我至今记不清优先级,于是我都是

app.router << ("/client" // client_routes) << ("/auth" // auth_routes)

😓另外,考这个的多少有点魔怔了
xuanbg
2022-01-07 07:10:25 +08:00
不同语言的操作符优先级有可能不一致。反正加括号最保险,也更容易阅读。
sprite82
2022-01-07 17:47:59 +08:00
楼主说的是 不同语言 运算符优先顺序不一样的问题,结果一堆“加括号”的评论,这不是废话吗?这是常识,就像乘号优先于加号一样。不应该讨论下为什么位运算符优先级不同语言不一样?
seanzxx
2022-01-08 10:13:03 +08:00
常用的语言测试了一圈
0: Rust, Python, C, Java, Lua, Ruby, JS, PHP, Dart, C#
1: Go, Swift

一种常用的性能优化措施是把乘除法替换成位移
比如
buffer_size = 2 + int32_size * 4 替换成
buffer_size = 2 + int32_size << 2
如果是 Go 和 Swift ,那类似替换优雅又简洁;如果是其它语言,替换以后要加括号,还容易出 bug
个人猜测

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

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

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

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

© 2021 V2EX