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()