GOPL:二元赋值运算符“使我们免于重新评估?”

时间:2017-10-26 02:12:06

标签: go

Go编程语言(GOPL)的第36页包含以下内容:

  

每个算术和按位二元运算符都有一个相应的赋值运算符,例如,允许将最后一个语句重写为

     

count[x] *= scale

     

这使我们不必重复(并重新评估)变量的表达式。

我不了解重新评估的部分。作者的意思是说

count[x] = count[x] * scale

count[x] *= scale

编译为不同的字节码?

1 个答案:

答案 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程序表现完全相同。

这让我感到惊讶的事实本身就令人惊讶:我很少直接调用函数来获取数组索引,所以这个想法从未在我脑海中浮现。