看完裘老师的这篇关于表达式求值的帖子C/C++表达式求值。有个地方不明白。
有这样一句话
看下面例子:(a + b) * (c + d) fun(a++, b, a+5)
这里“*”的两个运算对象中哪个先算?fun及其三个参数按什么顺序计算?对第一个表达式,采用任何计算顺序都没关系,因为其中的子表达式都是引用透明的。第二个例子里的实参表达式出现了副作用,计算顺序就非常重要了。少数语言明确规定了运算对象的计算顺序(Java规定从左到右),C/C++ 则有意不予规定,既没有规定大多数二元运算的两个对象的计算顺序(除了&&、|| 和 ,),也没有规定函数参数和被调函数的计算顺序。在计算第二个表达式时,首先按照某种顺序算fun、a++、b和a+5,之后是顺序点,而后进入函数执行。
函数参数的计算顺序不确定,这一点我明白,但是这句话
也没有规定函数参数和被调函数的计算顺序。在计算第二个表达式时,首先按照某种顺序算fun、a++、b和a+5,之后是顺序点,而后进入函数执行
什么叫被调函数的计算顺序,并且,计算第二个表达式的时候,为什么裘老师写,“按照某种顺序计算fun,a++....”。fun,也需要计算吗??
还有这里
对于:
cout << a++ << a;
我们知道它是
(cout.operator <<(a++)).operator << (a);
的简写。先看外层函数调用,这里需要算出所用函数(由加下划线的一段得到),还需要计算a的值。
这个“先看外层函数调用,这里需要算出所用函数”,这个所用函数是指什么?。
(cout.operator <<(a++)).operator << (a);
这个式子,不是应该先调用前一个operator<<,再调用后一个operator<<吗?