#include<iostream.h>
void main()
{
int A=5,B=10;
for(int I=1;I<=2;I++)
{
cout<<"Line1="<<A++<<"&"<<B-2<<endl;
cout<<"Line2="<<++B<<"&"<<A+B<<endl;
}
}
这个程序的输出是
Line1=5&8
Line2=11&16
Line1=6&9
Line2=12&18
我以为在输出的第二行和第四行中会产生17和19,而不是16和18。这是因为,在循环的第一次运行中,首先A的值是5,第一条命令打印5&8,应该将A的值递增1,使其为6。在第二条命令中,应该打印11&(6+11),应该打印11&17,但输出的结果却不是这样。
我的推理漏洞在哪里?
我不是这方面的专家,但我相信是因为后台的操作顺序。
主要是"<< "是一种叫做重载操作符的东西,它的基本意思是,有人在某个地方写了它应该做什么,以及如何做。
cout<<"Line2="<<++B<<"&"<<A+B<<endl;
编译器必须做一些花哨的技巧来使它工作.程序运行在这样的代码中的方式,是从右到左.所以本质上,它的运行方式有点像你想象中的那样.首先,它推动endl,然后它做A+B并推动它,然后它推动&,然后它递增B并推动它,最后它推动Line2=形成完整的 "句子". 然后这些内容会被带到控制台(或者其他任何你可能有的东西)一次性打印到你的屏幕上。
为了解决这个问题,可以尝试把cout分成两行,就像这样。
cout <<"Line2="<<++B<<"&";
cout <<A+B<<endl;
或者,如果允许的话,试试把++B和A+B互换一下,这也能解决这个问题,不过你的结果也会反过来.
cout<<"Line2="<<A+B<<"&"<<++B<<endl;
tl;dr: A+B在B++之前,用长矛行或交换位置来做,应该可以解决这个问题。