簡體   English   中英

C ++ 11賦值表達式是從右到左求值的嗎?

[英]Is a C++11 assignment expression evaluated right to left?

表達式的求值順序一直是C ++中未指定行為的來源。 C ++ 11標准是否最終規定了評估的順序?

現在我們是否知道以下表達式的var1var2的值:

int var1 =10, var2=20;
var1 = var2 = 30;

var1=30 and var2=30 ,還是var1=20 and var2=30

不可以,新標准未指定所有子表達式的評估順序排序。

表達式a + b + c在語法上被分組為(a + b) + c ,但是三個子表達式abc可以按任意順序求值,並且求值沒有相對於彼此排序。

為了更具體一點,請考慮:

int main()
{
    return printf("Hello") + printf("World") + printf("\n");
}

至於您的代碼:那里沒有歧義。 它是一個表達式,形式為a = b的賦值表達式,其中a是左值var1b是子表達式var2 = 30 您想知道var120還是30的事實使我相信您不確定運算符的關聯性(for = )。 但是,這從來都不是模棱兩可的,並且在我能想到的所有語言變體中都得到了很好的說明。 分配運算符在右側關聯,導致我已經描述了子表達式ab 在C ++ 11中,語言的這一方面(極其基礎)沒有更改。

如果您確實想將兩個問題結合在一起,則應考慮以下表達式:

var1 = 10;
(var1 = 20) = (var2 = var1);

現在,最終表達式也是a = b ,但是ab都是非平凡的子表達式,其求值沒有順序。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM