永发信息网

cout运算顺序

答案:6  悬赏:10  手机版
解决时间 2021-03-10 11:16
#include
using namespace std;

int a=1;

int function(int x){
a=2;
return a;
}

int main() {
int x=3;
cout< system("pause");
return 0;
}
输出为什么是22而不是12
最佳答案
①首先:
cout是什么?是一个类的实例化对象(某种流类型的)。

②其次:
<< 是什么?是操作符重载,实际上cout<
如果我们把operator<< 这个函数名假设为 func
那么 cout<等效于 ((cout.func(a)).func(function(x))).func(endl);

③再次:
我问你一个你一定知道答案的问题:
int a=1;
cout<<(++a+(++a)+(++a))<你肯定知道是12.(在devC++下是10,但是这个不用管,因为devC++下这是个BUG,你应该用更稳定支持C++的VC10去试它)
如果你不知道为什么是12,那么是因为这个表达式先执行了三次++a,再输出a+a+a。
这就是C++语法中俗称的“前副作用”,就是在“整个”表达式执行之前就运算完成的。

④最后:

你肯定也知道,我在③举的例子跟你的问题表面上不是一码事,但是其实还是一码事:
((cout.func(a)).func(function(x))).func(endl); 是一个表达式整体,

C++先会把所有优先级最高的运算先执行:
我们模拟一下编译器:

读到 cout.func(a) 此时a是最高优先级表达式,
但是a已经是变量本身,
所以跳过去找另一个高优先的表达式(注意,此时不是直接执行cout.func(a))
接着是.func(function(x)),
注意,第二个func是不能在第一个func之前先执行的,
但是实参却需要先执行,所以是执行function(x),接着再执行endl(其实不用执行,因为endl已经是最小粒度表达式)。
此时再回头执行第一个func,返回一个对象,接着调用这个返回了的对象的func(第二个func)。

所以表达式((cout.func(a)).func(function(x))).func(endl);
等效于以下语句:
a; => 结果是变量a (此时a没有压栈或者说没有被传入func函数)
x; => 结果是变量x
function(x); => 返回结果假设是K
endl; =>结果是endl
cout.func(a); => 结果是返回一个对象C
C.func(K); => 结果是返回一个对象C2
C2.func(endl); => 结果是返回一个对象C3

C++和C不同,C的 printf("%d",(++a)+(++a)+(++a)); 等效于 printf("%d",(1+a)+(2+a)+(3+a));
这是由于C编译器用的是比较古老的编译器设计观念。

还有最后一点,C++这种特性到逗号表达式(不包括实参列表)为止为最小粒度。

我们把((cout.func(a)).func(function(x))).func(endl); 改为:

((cout.func(a)).func(function(x))).func(endl),++a;

后面的++a不会影响前面的函数调用。

而((cout.func(a)).func(function(++a))).func(endl);

会影响。

这就是因为逗号表达式是最小表达式粒度的原因 。

⑤ 不知道你理解没有,没有+Q 739227481
全部回答
你定义的a是全局变量,所以函数体里的调用将相应改变它的取值。
因为在定义function时 你写的是a=2; 而不是 int a=2; 后面用到的这个a 一直是全局变量 故都为2
当一个函数作为函数参数时,参数总是先要计算出来,外边的函数才能运行的。其实<<也是一个函数,是一个运算符的重载。所以 function(x)作为cout<<的一个参数, function(x)先运行,然后这句cout才输出。而如果有多个这样的函数时,编译程序会依次把函数压入堆栈,直到参数全部算出后才会传入函数调外层函数。所以,cout << a << function(x) << endl执行时,先压入a,再压入 function(x) ,然后 function(x) 执行,a变成2,再读a,所有堆栈内函数执行完,输出 所以得出22而不是12,这样说明白了吧
#include using namespace std; int a=1; int function(int x){ a=2; return a; } int main() { int x=3; cout<
  • 5楼网友:零点过十分
  • 2021-03-10 08:04
可以想象成printf("%d %d", a, function(a)); 参数从右到左入栈,function(a)先执行,所以a入栈时,已经是2了 **我的答案是错的,但是删不掉了
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯