Cirfe 2015-05-29 02:39 采纳率: 50%
浏览 1791
已采纳

关于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 2015-05-29 12: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指针->虚函数表->+偏移->子类函数体)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型