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 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败