"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

4418 次点击
所在节点    程序员
37 条回复
loading
2022-01-06 08:25:19 +08:00
感谢提醒,但像我这种菜鸟都是一堆括号的,如果有人说括号看晕,他是连工具都不会用的比我更菜的鸟。
Aruforce
2022-01-06 08:29:01 +08:00
感觉 0 好理解一点儿…
Rocketer
2022-01-06 08:32:34 +08:00
凡是有歧义的一律加括号
dejavuwind
2022-01-06 09:07:43 +08:00
不加括号的话 Java 的计算结果也是 0
cccer
2022-01-06 09:08:51 +08:00
不同类型的操作符混合肯定是要加括号,就算自己能肯定顺序别人也不一定明白。
iold
2022-01-06 09:14:48 +08:00
2i2Re2PLMaDnghL
2022-01-06 09:21:35 +08:00
Pascal 里面 and 和 or 优先级比数学运算还高(因为同时被视为位运算符
判断条件就一直一堆括号,习惯了除了日常习惯的(基本就是四则运算)或者倒错就会立刻严重出错(比如 4/2-2 ,或者矩阵运算)的或者符合结合律的运算以外都加括号。
nekoneko
2022-01-06 09:22:14 +08:00
因为只有 go 的操作符优先级是 移位优先于加减 的
其他 java python c 都是 加减优先于移位
iovekkk
2022-01-06 09:24:40 +08:00
头像不错
www5070504
2022-01-06 09:37:31 +08:00
我猜一会就有人跳出来说基本功 balabala 的
Leonard
2022-01-06 09:44:31 +08:00
不用在意这种事,加括号解决完事,大家看着都清晰方便。
这种一般只有某些考试里会考,真使用时用不上这些知识。
ychost
2022-01-06 10:07:55 +08:00
工作这么多年除了之前写嵌入式用到了位移,现在写 WEB 基本没用过
rillhu
2022-01-06 10:16:00 +08:00
看具体的语言吧,本人只熟悉 C ,C 里面`+` > `<<`,所以结果上述结果是 0 。
ipwx
2022-01-06 10:23:48 +08:00
一般除了加减乘除这种运算,一律加括号
msg7086
2022-01-06 10:31:08 +08:00
位移运算必加括号,血(不是)的教训。
mainjzb
2022-01-06 10:31:17 +08:00
fmt.Println(0<<1 + 1)
go 会按优先级自动格式化,建议其他语言学习
yazinnnn
2022-01-06 10:35:30 +08:00
我看谁还嘲笑 lisp 括号罗嗦
socketpeng
2022-01-06 10:39:54 +08:00
加个括号很难么?别人不知道,要是我在实际生产环境中发现这种代码,直接开骂
BeyondBouds
2022-01-06 10:50:16 +08:00
i+++++i-----的变种? 这种不直接打残?
majula
2022-01-06 11:08:35 +08:00
即使很熟悉运算符优先级,在书写可能有歧义的数学表达式时也尽可能加上括号

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

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

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

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

© 2021 V2EX