关于《C,C++表达式求值顺序 裘老的解释。》的疑问
常书 2014-09-29 10:54:13 引用原文如下:
"对于:
a=4;
cout << a++ << a;
我们知道它是
(cout.operator <<(a++)).operator << (a);
的简写。先看外层函数调用,这里需要算出所用函数(由加下划线的一段得到),还需要计算a的值。语言没有规定哪个先算。如果真的先算函数,这一计算中出现了另一次函数调用,在被调函数体执行前有一个顺序点,那时a++的副作用就会实现。如果是先算参数,求出a的值4,而后计算函数时的副作用当然不会改变它(这种情况下输出两个4)。当然,这些只是假设,实际应该说的是:这种东西根本不该写,讨论其效果没有意义。"
为方便讨论:
1.将cout称为对象A
2.将cout.operator<<(a++)返回的对象称为对象B
问题如下:
1,上面引文中,蓝色加亮部分分别指的是哪个对象的函数?
2,算出所用函数指的是什么意思?是执行函数?
3,平时用cout的时候,都是用的cout<<a<<b<<endl,执行顺序是打印a,然后打后b,最后换行,裘老的上面解释对这个执行顺序没有异议吧?
4.按裘老的前一个假设输出的是4,5?后一个假设的先算参数的话,参数不是要变成5了吗,他指的是怎么个算法?
5.按个人理解,上例中如果只是cout<<a++,这时输出4是没有问题的,问题在于对后一个调用传的的参数是计算后的还是计算前的,这里的没定义指的是计算后还是计算前都符合规定,也就是歧义的地方是整个表达式,a++真正执行是在B对象调用函数前,还是调用函数后,根据裘老的说法,函数调用前是一个顺序点,按我的理解,在B对象调用函数前,所有的副作用不是流言要实现了吗?不是应该要输出的4,5吗?(我用的DEV C++运行这段代码的结果就是4 5)
好凌乱啊,求指点。。。。