C 中賦值語句的求值順序
當映射元素賦值時,例如mp[10] = mp. size() 時,表達式的求值順序變得至關重要。此特定表達式會產生意外結果“0 1”,這引發了有關 C 中指定的求值順序的問題。
C 標準指定某些操作(例如函數呼叫)的求值順序未指定。但是,像 = 這樣的賦值運算子會在左右操作數求值之後進行排序,從而在指定的順序中留下間隙。這種模糊性導致需要一個完善的提案。
最近的 C 標準提案 (N4228) 試圖透過指定某些情況的評估順序來解決這個問題。根據 N4228,這個特定的賦值表達式屬於未指定行為的類別,其中兩個運算元計算都是無序的。
根據 N4228 的修訂版本 (P0145R0),現在指定了此行為。修訂後的 [expr.ass] 部分指出,賦值運算子的右操作數在左運算元之前排序。因此,在給定的表達式中,將首先計算 mp.size(),然後將結果指派給 mp[10]。更新後的 C 17 標準預計會澄清此評估順序。
總之,在某些情況下賦值語句的評估順序仍然未指定,但最新的 C 標準提案(N4228)旨在細化這些規則。目前接受的規範 P0145R3 闡明了賦值的右操作數在左操作數之前進行計算,從而解決了給定表達式中的歧義。
以上是C 如何計算賦值語句中的右操作數和左操作數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!