你能解释一下为什么下面的程序的结果不同吗?
程序:
#define MUL(X) X*X
int main()
{
int i=3;
cout<<MUL(++i)<<"n";
return 0;
}
输出:
25
为了分析这一点,让我们展开宏,它变得++i * ++i
。
从形式上讲,++i * ++i
的行为是不确定的,因为*
不是排序点,++
突变i
。因此,编译器可以执行任何操作,无需进一步解释。
如果您的编译器支持 typeof
(这是编译时可评估的,因此不会执行任何增量)和表达式语句,则宏的安全版本是
#define MUL(i) ({
typeof(i) j = (i);
j*j;
})
尽管完全避免宏并使用函数是明智的。