亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

++ 是 += 1 的語法糖嗎?

++ 是 += 1 的語法糖嗎?

Go
收到一只叮咚 2022-11-08 16:31:21
據我了解,索引地圖會返回地圖值的副本??紤]到這一點,請考慮以下代碼:package mainimport "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。否則,我錯過了什么?
查看完整描述

2 回答

?
婷婷同學_

TA貢獻1844條經驗 獲得超8個贊

“我的理由是 m["xxx"] 返回值的副本” ——我認為這不是一個公平的假設。索引表達式下的規范僅說明以下內容:

表單的主要表達式表示[...] 映射的a[x] 元素ax

如果地圖包含一個帶有 key 的條目x,a[x] 是帶有 key 的地圖元素x

動詞“表示”和“是”可以說并不意味著副本。僅當您將索引表達式的結果分配給變量時才會進行復制。

地圖索引表達式根本不可尋址,因此您無法記憶地圖中存儲的值的別名。

至于增量運算符是否++是語法糖+= 1,規范明確指出

以下賦值語句在語義上是等價的:

IncDec 語句分配
x++ x += 1
x-- x -= 1

Soop++與 具有相同的含義op += 1,并且使用 keya[x]++遞增a[x]“表示/是”映射元素的操作數x。


查看完整回答
反對 回復 2022-11-08
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

語言規范說 ++/-- 運算符應該使用映射索引表達式作為操作數。

https://go.dev/ref/spec#IncDec_statements

“++”和“--”語句通過無類型常量 1 遞增或遞減它們的操作數。與賦值一樣,操作數必須是可尋址的或映射索引表達式。

未指定應如何實現該功能,因此在不同編譯器或同一編譯器的不同版本之間可能會有所不同。


如果你搜索cmd/compile/internal你的 Go 安裝目錄,如果我沒記錯的話,這是 Go 編譯器的源代碼,你會發現很多行似乎證實了你的猜測。但是,我對代碼的了解還遠遠不夠,無法提供結論性的答案。

示例:

我從未看過的規范的gccgo實現可能會也可能不會以同樣的方式執行 IncDec。


查看完整回答
反對 回復 2022-11-08
  • 2 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號