2012-05-29 98 views
1

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

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

经典的例子问题,但我无法说服以下是有效还是无效自己

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

bar(foo(i), i); 

据我了解,为了“富(I) '和'我'的评估是未定义的,但“评估”究竟意味着什么?即bar的第二个参数总是为42,还是可以在foo改变之前传入'i'的当前值?

+1

订单未指定,未定义... –

+0

类似的帖子在这里,http://stackoverflow.com/questions/10782863/what-is-the-correct-answer-for-cout-cc –

回答

4

不,不保证。
参数对函数的评估顺序是未指定[参考文献1]
它可以是可能的,或者:

  • foo(i)获取评估第一或
  • i获取评估或
  • 任何其他神奇顺序(在参数情况下数为两个以上的

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


[参考1]
C++ 03 5.2.2功能呼叫 第8段

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

+0

什么是“任何其他神奇的秩序“?还有其他的可能吗? –

+0

@OliCharlesworth:修改使其更清楚。 –

+0

谢谢。我的困惑在于“评估”的实际含义,例如表达'我'不需要评估(现在我说这样看起来更明显) –

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。

所以确实不能保证。