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