这类案件的执行顺序是怎样的?

What is the order of execution in these type of cases?

我定义了一个宏来求一个数的平方。

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

更好的是,因为宏确实提供了很多像这样的陷阱,你应该简单地使用一个干净定义的函数。对于现代编译器,大多数使用宏的理由都已过时。