2

我试图一劳永逸地确定表达式的评估方式。带着我的这个追求,我想出了这个我不知道该怎么做的例子。

#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 认为可能存在未定义行为的情况?两个预增量的副作用是相对于彼此排序的。

干杯,安德烈

4

2 回答 2

7

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

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

于 2013-10-24T13:24:19.767 回答
2

这取决于您所说的“预增量”是什么意思……您正在这样阅读它:

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

但是你可以很容易地做到这一点:

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

我不认为规范需要一种或另一种方式。

于 2013-10-24T13:25:40.940 回答