[英]Order of assignment vs order of initialization
以此示例代碼為例:
int a = 10;
int b = 20;
int c = 30;
int & foo1() {
qDebug() << "foo1" << endl;
return a;
}
int & foo2() {
qDebug() << "foo2" << endl;
return b;
}
int & foo3() {
qDebug() << "foo3" << endl;
return c;
}
int main(void)
{
foo1() = foo2() = foo3() = 7;
}
由於賦值從右到左,我希望首先看到foo3
,最后看到foo1
,但它是相反的。
具體如何定義這些場景的規則以及如何定義? 此外,編譯器是否區分賦值和其他運算符以及如果在不同於初始化的上下文中使用=
運算符,那將是如何實現的? 也許鏈的分配與其他鏈接的處理方式不同?
完整的表達
foo1() = foo2() = foo3() = 7
可以使用以下樹抽象:
=
/ \
foo1() =
/ \
foo2() =
/ \
foo3() 7
可以按任何順序評估該樹的葉子。 您的編譯器可以自由選擇。 僅用於調用賦值運算符時,必須首先計算掛在它們上的表達式。 在你的情況下,葉子按foo1()
, foo2()
和foo3()
的順序進行評估。
對左關聯的權利=
僅出現在樹的形狀,但不是在評價的順序。 樹為
std::cout << foo1() << foo2() << foo3()
看起來像
<<
/ \
<< foo3()
/ \
<< foo2()
/ \
std::cout foo1()
同樣,可以按任何順序評估foo
函數,但是operator<<()
的評估順序是明確定義的。 有一篇關於序列點的有趣帖子很好地描述了這些主題。
操作員關聯性(即從右到左)與評估順序無關。 *操作數的評估順序未指定。
&&
, ||
而且,
。
子表達式的計算順序與其結果的應用方式不同!
foo1()可以提前調用,只是在其他人也完成之前不能應用賦值本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.