C++ 分配顺序与初始化顺序

C++ 分配顺序与初始化顺序,c++,initialization,assignment-operator,chaining,C++,Initialization,Assignment Operator,Chaining,以以下代码为例: 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() << "fo

以以下代码为例:

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;
}
inta=10;
int b=20;
int c=30;
int&foo1(){
qDebug()运算符关联性(即从右到左)与求值顺序无关。*未指定操作数的求值顺序



*除了少数情况外,即
&
|

子表达式的求值顺序与其结果的应用顺序不同

foo1()可以提前调用,只是赋值本身不能在其他赋值完成之前应用。

完整表达式

foo1() = foo2() = foo3() = 7
可以使用以下树进行抽象:

     =
   /   \
foo1()   = 
       /   \
    foo2()   =
           /   \
        foo3()   7
该树的叶子可以按任何顺序求值。编译器可以自由选择。仅在调用赋值运算符时,必须首先求值挂在叶子上的表达式。在您的情况下,叶子的求值顺序为
foo1()
foo2()
,然后是
foo3()

=
的从右到左关联性仅在树的形状中可见,而不是在求值的顺序中

std::cout << foo1() << foo2() << foo3()

std::cout,甚至对于
&&
| |
来说,只有内置版本有指定的顺序(这就是为什么您永远不应该重载它们)。+1对于完整的答案和ascii艺术,让我们将您四舍五入到2.5k代表
                   << 
                 /    \
              <<      foo3()
            /    \
         <<      foo2()
       /    \
std::cout   foo1()