其实,这里主要是要搞清楚输出的顺序。
对于
cout<来说,是从右往左依次把结果压入缓冲区,最后再整体输出出来。也就是说,
先计算add(j),此时结果为2,n=2,;再计算add(i),此时结果为3,n=3。
所以输出的结果为3 2。
当运行
cout<cout< 的时候,先计算add(i),此时结果为1,n=1;再计算add(j),此时结果为3,n=3;
所以输出的结果为1 3。
如果在add中使用输出n的话,也是根据第一种情况,则显示2 3 。
把add中的结果显示完后,再显示整个语句的结果。
因此结果为 2 3 3 2。
cout<
C++中这种表达式的运算顺序是不确定的,不能保证 add(i) 先执行, add(j) 后执行 —— 事实上通常是相反的顺序,即先调用 add(j) 后调用 add(i),但是可以确定的是只有调用过 add(i) 以后才能输出 add(i) 的返回值,输出 add(i) 的返回值以后才能输出 add(j) 的返回值
这解释很绕吧。避免这种麻烦的最好办法就是不要写这种代码
你是分开来调用还是一起用的?
cout<
我来回答:
cout << add(i) << add(j) << endl;——对于绝大多数编译器,这个语句先计算add(j)压栈,再计算add(i)压栈。最后再后进先出从栈里弹出来。那么调用add(j)时使函数add中的静态变量n变成了2,再调用add(i)时又使n变成了3。输出时先弹出3,再弹出2;这不就是输出3 2吗?有什么奇怪?用cout << add(i);和cout<