【问题标题】:GOPL: Binary assignment operator "saves us from re-evaluation?"GOPL:二元赋值运算符“使我们免于重新评估?”
【发布时间】:2017-10-26 02:12:06
【问题描述】:

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

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

count[x] *= scale

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

我不明白关于重新评估的部分。作者的意思是这样吗

count[x] = count[x] * scale

count[x] *= scale

编译成不同的字节码?

【问题讨论】:

  • "是否...编译成不同的字节码?"也许。也许不吧。但是想想如果count[n(17)]func n(int) int。使用赋值运算符,您可以保证不会对其进行两次评估。 (不:Go 中没有任何内容编译为字节码。Go 编译为机器码。)

标签: go


【解决方案1】:

这两个版本可能功能不同(感谢您的提示,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 程序的行为方式完全相同。

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

【讨论】:

    猜你喜欢
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2019-05-24
    • 2021-09-11
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多