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

Tej*_*ula 1 c++

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

计划:

#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)

Bat*_*eba 5

为了分析这个,让我们扩展宏,它变成了++i * ++i.

形式上,行为++i * ++i未定义的,因为*它不是一个排序点,并且会++改变它i.所以编译器可以做任何事情,不需要进一步的解释.

如果你的编译器支持typeof(这是编译时评估,以便不会做任何递增),和表达式语句,那么您的宏安全版本

#define MUL(i) ({    \
    typeof(i) j = (i);  \
    j*j;                \
})
Run Code Online (Sandbox Code Playgroud)

虽然完全避免使用宏并使用函数是明智的.

  • @BoBTFish:选择世界上任何公司从所有仍然维护的项目中统一选择的随机C++项目,它的C++> = 11的可能性仍然小于10%(可能相当少). (3认同)