【问题标题】:C++ Expression evaluation. What does 'evaluation' mean?C++ 表达式评估。 “评价”是什么意思?
【发布时间】:2012-05-29 11:29:20
【问题描述】:

我理解经典例子的问题

int i=0;
foo(i++, i++);

但我无法说服自己以下是有效还是无效

int foo(int& i)
{
   i=42;
   return 99;
}

bar(foo(i), i);

我知道“foo(i)”和“i”的求值顺序是未定义的,但“求值”到底是什么意思?即 bar 的第二个参数总是 42,还是可以在 foo 更改之前传入 'i' 的当前值?

【问题讨论】:

标签: c++ expression evaluation


【解决方案1】:

不,不能保证。
函数参数的求值顺序是未指定[Ref 1]
有可能是:

  • foo(i) 首先被评估或
  • i 被评估或
  • 任何其他魔法命令(如果参数数量超过两个

在此上下文中未指定意味着允许实现以任何他们想要的方式实现所述功能,并且不需要记录。


[参考 1]
C++03 5.2.2 函数调用 第 8 段

参数的评估顺序未指定。参数表达式评估的所有副作用在输入函数之前生效。后缀表达式和参数表达式列表的求值顺序未指定。

【讨论】:

  • 什么是“任何其他魔法命令”?还有其他可能吗?
  • 谢谢。我的困惑是“评估”实际上意味着什么,例如是否不需要评估表达式“我”(现在我这样说似乎更明显)
【解决方案2】:

此示例(gcc 4.6)

#include <iostream>
using namespace std;

int foo(int& i)
{
    i=42;
    return 99;
}

void bar(int i, int j)
{
    cout << "i = " << i << "; j = " << j << endl;
}

int main()
{
    int i =10;
    bar(foo(i), i);
    return 0;
}

给出 i = 99,j = 10。

所以真的不能保证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多