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

Why result is different if prefix variable is passed in SQUARE macro?

本文关键字:变量 为什么 结果 有所不同 前缀 SQUARE 如果      更新时间:2023-10-16

你能解释一下为什么下面的程序的结果不同吗?

程序:

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

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