2 l108103t l108103t 于 2015.05.29 10:39 提问

关于c++表达式求值的一些问题,求大神解答

看完裘老师的这篇关于表达式求值的帖子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<<吗?

1个回答

nswcfd
nswcfd   2015.05.29 20:51
已采纳

学习了裘老师的帖子,原来优先级跟顺序点是两个不同的概念。

=====》 话说“顺序点”是哪个单词翻译过来的? 《====

为了便于理解,把operator <<替换为f(iostream *, int),那么这个表达式就是 f (f(cout, a++), a),给两个f分别命名(看成不同的函数),表达式为f2( f1(cout, a++), a)
语义上是先求f1的值,再求f2的值,没有问题。
但这不影响一个实现先去计算f2的第二个参数,然后计算f2的第一个参数。(满足先计算f1再计算f2的约束)
再比如strcmp( fgets(File1), fgets(File2)),到底是先读File1还是先读File2,取决于编译器的实现。

func本身也是表达式啊,如果是虚函数的话,在运行时经过计算才能确定是哪个子类的函数(this指针->虚函数表->+偏移->子类函数体)

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!