无意中写下了如下代码:
int a = 10;
cout << "a = " << a << ", " << (a+=10, a) << endl;
按照正常的读取逻辑,输出应该是a=10, 20\n
,然而实际结果并不是想象中的那样,正确答案如图:

不信? 我再写一个:

So,为什么cout是从又向左解析的呢?于是本喵去编呼上找了一下。虽然没找到明确的答案,但是从中受到了启发。

想必聪明的你看到"FFF"的时候就已经知道答案了。于是我也做出了大胆的推测:
// 这一行的本质上就是一个个'operator<<'函数层层嵌套。
// ostream & operator<<(ostream & os, const Data &data);
cout << "a = " << a << ", " << (a+10, a) << endl;
// 那我们可以写成这个样子。
operator(operator(operator(operator(...), ", ") , (a+=10, a) ), endl);
并且你需要知道一件事情,函数(大多数编译器是这样的)在执行时,参数的压栈顺序是从右边到左边压入的。
所以 在输出(a+=10, a)
和a
的时候,(a+=10, a)
先压入栈中,a+=10
就会先执行,导致第一个a
的值也受到影响。
网友评论