![](/img/trans.png)
[英]Overloading assignment operator when the object is on the right-hand side of the assignment
[英]does subscript evaluate before the right hand side of assignment operator
我正在嘗試做類似的事情
arr[getchar()-'a'] = getchar();
是否保證這里的下標在其他任何事情之前評估?
C++17之前,不保證順序
從C++17 開始:(來自C++ 的求值順序)
17) 在下標表達式 E1[E2] 中,E1 的每個值計算和副作用都排在 E2 的每個值計算和副作用之前
20) 在每個簡單賦值表達式 E1=E2 和每個復合賦值表達式 E1@=E2 中,E2 的每個值計算和副作用都在 E1 的每個值計算和副作用之前排序
所以在你的情況下:
arr[getchar()-'a'] = getchar();
// (2) (3) (1)
不,不能保證。 (至少對於 C++17 之前的代碼,正如其他人提到的那樣)。
任何表達式的任何部分的求值順序,包括函數參數的求值順序是未指定的 [...]。 編譯器可以以任何順序計算操作數和其他子表達式,並且在再次計算相同表達式時可以選擇其他順序。
C++ 中沒有從左到右或從右到左求值的概念。 這不要與運算符的從左到右和從右到左結合性混淆:表達式 a() + b() + c() 被解析為 (a() + b()) + c( ) 由於 operator+ 的從左到右結合性,但對 c 的函數調用可能會在運行時首先、最后或在 a() 或 b() 之間進行評估
我在這里引用了 C++ 參考,但同樣適用於 C 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.