连续很很多个cout时,发现的问题

无意中写下了如下代码:

int a = 10;
cout << "a = " << a << ", " << (a+=10, a) << endl;

按照正常的读取逻辑,输出应该是a=10, 20\n,然而实际结果并不是想象中的那样,正确答案如图:

12499787-56e7eab8379ea5f1.png
amazing!

不信? 我再写一个:
12499787-05aed824939b0732.png
怕了吧


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


12499787-44100c108fc90945.png
interesting

想必聪明的你看到"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的值也受到影响。

猜你喜欢

转载自blog.csdn.net/weixin_34161083/article/details/90826857