首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >++是+= 1的语法糖吗?

++是+= 1的语法糖吗?
EN

Stack Overflow用户
提问于 2022-02-17 19:27:47
回答 1查看 152关注 0票数 0

据我所知,索引地图将返回映射值的副本。考虑到这一点,请考虑以下代码:

代码语言:javascript
复制
package main

import "fmt"

func main() {
    m := map[string]int{"xxx": 100}
    m["xxx"]++
    fmt.Println(m["xxx"]) // prints 101
}

上面的代码打印101,而我期望的是100。我的推理是,m["xxx"]返回分配给键"xxx" (即100)的值的副本,运算符++增加了这个值的副本,但这并不影响映射中存储的原始值--只有副本更改。

但是,考虑到通过将键放在括号内并使用=指定值(即m[key] = value),我们为映射键分配了一个值。然后,如果编译器将m["xxx"]++转换为m["xxx"] += 1 --这又相当于m["xxx"] = m["xxx"] + 1 --这将解释上述代码的结果。

我的问题是增量运算符(++)是否为逐一加法赋值(+= 1)的语法糖。否则,我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 20:25:01

语言规范规定++/-运算符应该使用映射索引表达式作为操作数。

语句

"++“和”-“语句通过非类型化常量1递增或减少它们的操作数。与赋值一样,操作数必须是可寻址的或映射索引表达式

未指定如何实现该功能,因此同一编译器的不同编译器或不同版本的编译器可能会有所不同。

如果您搜索Go安装的cmd/compile/internal目录(这是Go编译器的源代码,如果我没有弄错的话),您会发现许多行似乎证实了您的猜测。然而,我对代码的了解还远远不够,无法给出一个结论性的答案。

例子:

我从未看过的规范的gccgo实现可能也可能不会以相同的方式执行IncDec。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71164283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档