评估顺序示例

时间:2013-10-24 13:20:31

标签: c++ operator-precedence

我试图一劳永逸地在脑海中设置表达式的评估方式。在我的这个任务中,我想出了这个例子,我不知道该怎么做。

#include <iostream>
using namespace std;
typedef void(*func)(int);

void r( int i )
{
    cout << i << endl;
}
func f( int i )
{
   cout << i << endl;
   return &r;
}

int main()
{
   int i = 0;
   f(++i)(++i);
   return 0;
}

使用MVSC 2008编译这段代码将生成此输出:2 2.使用gcc 4.8.1编译的相同代码将引发警告(对i的操作可能未定义)并将生成此输出:1 2

我想要了解的是为什么gcc 4.8.1认为可能存在未定义行为的情况?两个预增量的副作用相对于彼此进行排序。

干杯, 安德烈

2 个答案:

答案 0 :(得分:7)

  

两个预增量的副作用相对于彼此进行排序。

不,他们不是。每个参数评估在其函数调用之前进行排序,并且函数调用相互排序;但是两者都可以在第一次调用之前进行评估,在这种情况下,没有什么可以互相排序。

答案 1 :(得分:2)

这取决于你的意思是'预增量'......你是这样读的:

  ++i
f(i)
      ++i
f (i) (i)

但你可以轻松地做到这一点:

 ++i
      ++i
 f(i)
 f(i) (i)

我认为规范不需要这样或那样。