评估示例的顺序

Order of evaluation example

本文关键字:顺序 评估      更新时间:2023-10-16

我试图一劳永逸地在脑海中设定如何计算表达式。随着我的这个追求,我想出了这个我不知道该怎么做的例子。

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

干杯安德烈

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

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

这取决于你所说的"预增量"是什么意思......你是这样读的:

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

但是您可以轻松地执行此操作:

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

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