[英]Is a C++11 assignment expression evaluated right to left?
表達式的求值順序一直是C ++中未指定行為的來源。 C ++ 11標准是否最終規定了評估的順序?
現在我們是否知道以下表達式的var1
和var2
的值:
int var1 =10, var2=20;
var1 = var2 = 30;
是var1=30 and var2=30
,還是var1=20 and var2=30
?
不可以,新標准未指定所有子表達式的評估順序或排序。
表達式a + b + c
在語法上被分組為(a + b) + c
,但是三個子表達式a
, b
和c
可以按任意順序求值,並且求值沒有相對於彼此排序。
為了更具體一點,請考慮:
int main()
{
return printf("Hello") + printf("World") + printf("\n");
}
至於您的代碼:那里沒有歧義。 它是一個表達式,形式為a = b
的賦值表達式,其中a
是左值var1
, b
是子表達式var2 = 30
。 您想知道var1
是20
還是30
的事實使我相信您不確定運算符的關聯性(for =
)。 但是,這從來都不是模棱兩可的,並且在我能想到的所有語言變體中都得到了很好的說明。 分配運算符在右側關聯,導致我已經描述了子表達式a
和b
。 在C ++ 11中,語言的這一方面(極其基礎)沒有更改。
如果您確實想將兩個問題結合在一起,則應考慮以下表達式:
var1 = 10;
(var1 = 20) = (var2 = var1);
現在,最終表達式也是a = b
,但是a
和b
都是非平凡的子表達式,其求值沒有順序。
var1 = var2 = 30;
兩者均應為30
,並由標准指定。 沒有指定的是,如果賦值操作數是必須在賦值之前求值的復雜表達式,則求值順序是什么?
(expr1) = (expr2) = x;
1 2
or
(expr1) = (expr2) = x;
2 1
賦值運算符(=)和復合賦值運算符均從右到左分組。
這沒有告訴我們有關評估順序的任何信息。 這僅意味着將a = b = c
解析為a = (b = c)
而不是(a = b) = c
。
1.9/15
仍然適用:
除非另有說明,否則不對單個運算符的操作數和單個表達式的子表達式求值。
排序規則僅引入部分排序。 在這樣的表達式中:
(x+42) = (y+42)
確保在對(x+42)
的結果進行賦值之前都執行了兩個子表達式(x+42)
和(y+42)
,但是兩個子表達式本身未排序。 任一個都可以在另一個執行之前執行,甚至可以交錯執行,並且在執行程序期間順序不必保持一致。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.