我试图一劳永逸地确定表达式的评估方式。带着我的这个追求,我想出了这个我不知道该怎么做的例子。
#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 认为可能存在未定义行为的情况?两个预增量的副作用是相对于彼此排序的。
干杯,安德烈