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

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

  •  
  •   MiketsuSmasher · Jan 6, 2022 · 5762 views
    This topic created in 1763 days ago, the information mentioned may be changed or developed.

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

    python:

    print(0 << 1 + 1)
    

    输出:0

    golang:

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

    输出:1

    Supplement 1  ·  Jan 6, 2022

    为了让python和golang的行为一致,我只好为表达式里的"0 << 1"加了括号

    37 replies  •  2022-01-08 10:13:03 +08:00
    loading
    loading
    Jan 6, 2022
    1
    感谢提醒,但像我这种菜鸟都是一堆括号的,如果有人说括号看晕,他是连工具都不会用的比我更菜的鸟。
    Aruforce
    Aruforce
    Jan 6, 2022 via Android
    2
    感觉 0 好理解一点儿…
    Rocketer
    Rocketer
    Jan 6, 2022 via iPhone
    3
    凡是有歧义的一律加括号
    hiwind
    hiwind
    Jan 6, 2022
    4
    不加括号的话 Java 的计算结果也是 0
    cccer
    cccer
    Jan 6, 2022
    5
    不同类型的操作符混合肯定是要加括号,就算自己能肯定顺序别人也不一定明白。
    iold
    iold
    Jan 6, 2022
    6
    2i2Re2PLMaDnghL
    2i2Re2PLMaDnghL
    Jan 6, 2022
    7
    Pascal 里面 and 和 or 优先级比数学运算还高(因为同时被视为位运算符
    判断条件就一直一堆括号,习惯了除了日常习惯的(基本就是四则运算)或者倒错就会立刻严重出错(比如 4/2-2 ,或者矩阵运算)的或者符合结合律的运算以外都加括号。
    nekoneko
    nekoneko
    Jan 6, 2022❤️1
    8
    因为只有 go 的操作符优先级是 移位优先于加减 的
    其他 java python c 都是 加减优先于移位
    iovekkk
    iovekkk
    Jan 6, 2022
    9
    头像不错
    www5070504
    www5070504
    Jan 6, 2022
    10
    我猜一会就有人跳出来说基本功 balabala 的
    Leonard
    Leonard
    Jan 6, 2022
    11
    不用在意这种事,加括号解决完事,大家看着都清晰方便。
    这种一般只有某些考试里会考,真使用时用不上这些知识。
    ychost
    ychost
    Jan 6, 2022
    12
    工作这么多年除了之前写嵌入式用到了位移,现在写 WEB 基本没用过
    rillhu
    rillhu
    Jan 6, 2022
    13
    看具体的语言吧,本人只熟悉 C ,C 里面`+` > `<<`,所以结果上述结果是 0 。
    ipwx
    ipwx
    Jan 6, 2022
    14
    一般除了加减乘除这种运算,一律加括号
    msg7086
    msg7086
    Jan 6, 2022 via Android
    15
    位移运算必加括号,血(不是)的教训。
    mainjzb
    mainjzb
    Jan 6, 2022
    16
    fmt.Println(0<<1 + 1)
    go 会按优先级自动格式化,建议其他语言学习
    yazinnnn
    yazinnnn
    Jan 6, 2022
    17
    我看谁还嘲笑 lisp 括号罗嗦
    socketpeng
    socketpeng
    Jan 6, 2022
    18
    加个括号很难么?别人不知道,要是我在实际生产环境中发现这种代码,直接开骂
    ShowYourPrompt
    ShowYourPrompt
    Jan 6, 2022
    19
    i+++++i-----的变种? 这种不直接打残?
    48y1951r9G8k7Zou
    48y1951r9G8k7Zou
    Jan 6, 2022 via iPhone
    20
    即使很熟悉运算符优先级,在书写可能有歧义的数学表达式时也尽可能加上括号
    littlewing
    littlewing
    Jan 6, 2022
    21
    没必要纠结这种东西,啥,你说面试有人问?我反手就给他一巴掌
    yangyaofei
    yangyaofei
    Jan 6, 2022
    22
    这种的意义是啥, 就像 ++i+++=++i++, 没有任何意义
    QingXuJiaZhi
    QingXuJiaZhi
    Jan 6, 2022
    23
    @yazinnnn “嘲笑 lisp 括号罗嗦”本来就是菜鸟行为
    yazinnnn
    yazinnnn
    Jan 6, 2022
    24
    @cmdOptionKana 本站就不少。
    mikewang
    mikewang
    Jan 6, 2022
    25
    涉及到位运算的,还是都加上括号吧。位运算本身就不是非常优美,多加点括号啰嗦一下也没什么事。
    ch2
    ch2
    Jan 6, 2022
    26
    不同语言运算符优先级不一样,位运算在 C 系里优先级很低的
    acmore
    acmore
    Jan 6, 2022
    27
    遇事不决加括号,编程不仰赖记忆力
    AoEiuV020CN
    AoEiuV020CN
    Jan 6, 2022
    28
    先乘除后加减,其他尽量都上括号,
    crayygy
    crayygy
    Jan 6, 2022
    29
    都说加括号,我不太一样,我宁可多用一个变量然后分两步写,位运算尽量分开,方便 debug
    icenine
    icenine
    Jan 6, 2022
    30
    直接上括号,但凡你会一种以上的语言,深究这种语法细节有啥意义
    muzuiget
    muzuiget
    Jan 6, 2022
    32
    我不想,我直接加括号。
    gengchun
    gengchun
    Jan 6, 2022
    33
    @crayygy 这个看具体的代码类型。

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

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

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

    😓另外,考这个的多少有点魔怔了
    xuanbg
    xuanbg
    Jan 7, 2022
    35
    不同语言的操作符优先级有可能不一致。反正加括号最保险,也更容易阅读。
    sprite82
    sprite82
    Jan 7, 2022
    36
    楼主说的是 不同语言 运算符优先顺序不一样的问题,结果一堆“加括号”的评论,这不是废话吗?这是常识,就像乘号优先于加号一样。不应该讨论下为什么位运算符优先级不同语言不一样?
    seanzxx
    seanzxx
    Jan 8, 2022
    37
    常用的语言测试了一圈
    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
    个人猜测
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1755 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 87ms · UTC 17:19 · PVG 01:19 · LAX 09:19 · JFK 12:19
    ♥ Do have faith in what you're doing.