您能否解释为什么以下程序的结果不同?
计划:
#define MUL(X) X*X
int main()
{
int i=3;
cout<<MUL(++i)<<"\n";
return 0;
}
输出:
25
答案 0 :(得分:5)
为了分析这一点,让我们展开宏,它变为++i * ++i
。
正式地,++i * ++i
的行为未定义,因为*
不是排序点,++
会改变i
。所以编译器可以做任何事情,不需要进一步解释。
如果您的编译器支持typeof
(编译时可评估,因此不会进行任何递增)和表达式语句,那么宏的安全版本是
#define MUL(i) ({ \
typeof(i) j = (i); \
j*j; \
})
尽管完全避免使用宏并使用函数是明智的。