在这类情况下,执行的顺序是什么?

问题描述

我已经定义了一个宏来查找数字的平方。

#include<iostream>
#define square(x) x*x
using namespace std;
int main()
{
    int a = square(2+3);
    cout<<a<<endl;
}

在上述情况下,输出为11。我用(3 + 2)替换了括号中的表达式,然后输出为11。类似地,对于(4 + 2)和(2 + 4),输出为14

我已将'+'替换为'*',它给出了正常的输出,就像它首先计算了方括号中的表达式并计算了平方。

谁能告诉我如何概括输出,例如执行顺序是什么?

解决方法

有了#define square(x) x*x,这个square(2+3)就变成了

2+3*2+3。当然,由于*优于+,哪个会导致意外结果。 *不会发生此问题,因为在这种情况下,优先顺序无关紧要。

您可能想要#define square(x) (x)*(x)才能获得(2+3)*(2+3)

或者,不太容易遭受类似性质的间接问题

#define square(x) ((x)*(x)),以获取((2+3)*(2+3))

更好的是,因为宏确实提供了许多陷阱,例如陷阱,您应该只使用一个明确定义的函数。对于现代的编译器,大多数使用宏的理由已经过时了。