如果在SQUARE宏中传递前缀变量,为什么结果会有所不同?

时间:2016-02-05 12:18:35

标签: c++

您能否解释为什么以下程序的结果不同?

计划:

#define MUL(X) X*X
int main()
{
  int i=3;
  cout<<MUL(++i)<<"\n";
  return 0;
}

输出:

25

1 个答案:

答案 0 :(得分:5)

为了分析这一点,让我们展开宏,它变为++i * ++i

正式地,++i * ++i的行为未定义,因为*不是排序点,++会改变i。所以编译器可以做任何事情,不需要进一步解释。

如果您的编译器支持typeof(编译时可评估,因此不会进行任何递增)和表达式语句,那么宏的安全版本是

#define MUL(i) ({    \
    typeof(i) j = (i);  \
    j*j;                \
})

尽管完全避免使用宏并使用函数是明智的。