C ++表达式评估。 “评估”是什么意思?

时间:2012-05-29 11:29:20

标签: c++ expression evaluation

我理解

的经典例子的问题
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'的当前值吗?

2 个答案:

答案 0 :(得分:4)

不能保证。
函数参数的评估顺序为未指定 [Ref 1]
它可能是:

    首先评估
  • foo(i)
  • i获得评估或
  • 任何其他神奇的顺序(如果参数数量超过两个

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


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

  

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

答案 1 :(得分:0)

此样本(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。

所以真的不能保证。