Go运算符优先级影响表达式解析顺序,如a&b==c被解析为a&(b==c);<<、>>优先级低于+-,&&低于&;赋值运算符右结合且优先级最低;混合运算时应加括号确保语义正确。
Go 运算符优先级和结合性怎么影响表达式结果
Go 的运算符优先级不是靠死记,而是靠“括号少写但结果不变”来验证。它和数学直觉基本一致,但有几个关键例外:位移
、
优先级比加减还低;逻辑与
比按位与
低得多;赋值类操作(如
)优先级最低。
常见错误现象:
实际被解析为
,而不是你想的
—— 因为
优先级高于
。
所有二元算术/位运算符(
、
、
、
、
、
、
、
)都左结合
和
虽然也是左结合,但优先级仅高于
、
等比较运算符,低于加减
赋值运算符(
、
、
等)右结合,且优先级最低,所以
等价于
什么时候必须加括号才安全
不加括号也能跑通,不代表语义正确。尤其在混合位运算、比较、逻辑运算时,Go 不会报错,但结果往往反直觉。
使用场景:写条件判断、位掩码校验、状态合并(比如
),或做指针偏移计算(
)。
立即学习
“
go语言免费学习笔记(深入)
”;
→ 改成
,否则先算
再与
按位与
→ 实际是
,因为
优先级高于
;如果真想先移再加,得写
→
优先级高于
,等价于
,符合预期;但若想 “(a || b) && c”,就必须加括号
Go 和 C/Java 的优先级差异在哪
Go 故意简化了优先级层级(共 5 级),去掉了逗号、条件(
)、自增自减等易混淆操作符,但仍有两处关键不同容易踩坑:
go语言参考手册 中文CHM版
Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译
下载
C 中
(取地址)是单目运算符,优先级很高;Go 里没有取地址运算符参与表达式优先级计算(
是地址操作,不是表达式中的运算符),所以 Go 的
只有按位与含义,且优先级中等偏低
Go 没有
/
表达式用法,所以完全规避了
这类歧义问题
Go 的
、
可用于切片、map、func 类型比较(编译期报错),但优先级仍和数值比较一致,不会因类型不同而改变求值顺序
调试表达式执行顺序的最简方法
别靠查表,直接用
或打印中间值。小表达式就拆开测,大表达式加临时变量——这是最稳的实操习惯。
示例:不确定
怎么算?
这样既清晰,也方便断点或打日志。性能上现代 Go 编译器几乎能完全内联优化掉这些临时变量,不用怕“多写了就慢”。
真正复杂的是嵌套函数调用 + 运算符混用,比如
—— 此时不仅要看优先级,还要知道 Go 规定函数调用顺序未定义(实际通常从左到右,但不保证),所以别依赖
和
的副作用顺序。
<<>>&&&+=a & b == ca & (b == c)(a & b) == c==&+-*/%&|^<<>>==!==+=&=a += b *= 2b *= 2; a += bflags & READ | WRITEbase + offset << shiftif x&y == 0if (x & y) == 0y == 0xval << 2 + 3val << (2 + 3)+<<(val << 2) + 3a || b && c&&||a || (b && c)? :&&x&++--*p++==!=go tool compile -Sa << b + c & dtmp1 := b + c
tmp2 := a << tmp1
result := tmp2 & df() + g() << h()f()g()