这类案件的执行顺序是怎样的?
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))
.
更好的是,因为宏确实提供了很多像这样的陷阱,你应该简单地使用一个干净定义的函数。对于现代编译器,大多数使用宏的理由都已过时。
我定义了一个宏来求一个数的平方。
#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))
.
更好的是,因为宏确实提供了很多像这样的陷阱,你应该简单地使用一个干净定义的函数。对于现代编译器,大多数使用宏的理由都已过时。