我试图一劳永逸地在脑海中设置表达式的评估方式。在我的这个任务中,我想出了这个例子,我不知道该怎么做。
#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认为可能存在未定义行为的情况?两个预增量的副作用相对于彼此进行排序。
干杯, 安德烈
答案 0 :(得分:7)
两个预增量的副作用相对于彼此进行排序。
不,他们不是。每个参数评估在其函数调用之前进行排序,并且函数调用相互排序;但是两者都可以在第一次调用之前进行评估,在这种情况下,没有什么可以互相排序。
答案 1 :(得分:2)
这取决于你的意思是'预增量'......你是这样读的:
++i
f(i)
++i
f (i) (i)
但你可以轻松地做到这一点:
++i
++i
f(i)
f(i) (i)
我认为规范不需要这样或那样。