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

问题描述

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

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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...