Go编程语言(GOPL)的第36页包含以下内容:
每个算术和按位二元运算符都有一个相应的赋值运算符,例如,允许将最后一个语句重写为
count[x] *= scale
这使我们不必重复(并重新评估)变量的表达式。
我不了解重新评估的部分。作者的意思是说
count[x] = count[x] * scale
和
count[x] *= scale
编译为不同的字节码?
答案 0 :(得分:0)
两个版本可能功能不同(感谢您提示,Volker):
package main
import "fmt"
var idx int
func n() int {
idx++
return idx - 1
}
func main() {
var nums = [2](int){ 1, 2 }
var adj = 10
if true {
nums[ n() ] += adj // Prints [11 2]
} else {
nums[ n() ] = nums[ n() ] + adj // Prints [12 2]
}
fmt.Println("%v", nums)
}
(你可以玩它here。)
等效的C程序表现完全相同。
这让我感到惊讶的事实本身就令人惊讶:我很少直接调用函数来获取数组索引,所以这个想法从未在我脑海中浮现。