我在一个网站上看到了下面的代码。
我无法理解结果是如何作为 11
而不是 25
或 13
的。
为什么我想 25
因为 SQ(5) 5*5
或13
因为
SQ(2) = 4;
SQ(3) = 9;
可能最终结果将是 13 (9 + 4)
但惊讶地看到结果为 11
。
结果如何变成 11
?
using namespace std;
#define SQ(a) (a*a)
int main()
{
int ans = SQ(2 + 3);
cout << ans << endl;
system("pause");
}
最佳答案
预处理器对源代码进行简单的文本替换。它对底层语言或其规则一无所知。
在您的示例中,SQ(2 + 3)
扩展为 (2 + 3*2 + 3)
,计算结果为 11
.
定义 SQ
的更稳健的方法是:
#define SQ(a) ((a)*(a))
现在,SQ(2 + 3)
将扩展为 ((2 + 3)*(2 + 3))
,得到 25
.
尽管这个定义有所改进,但它仍然不是万无一失的。如果 SQ()
应用于带有 side effects 的表达式,这可能会产生不良后果。例如:
- 如果
f()
是一个将某些内容打印到控制台并返回int
的函数,则SQ(f())
将产生在输出中被打印两次。 - 如果
i
是一个int
变量,SQ(i++)
结果为undefined behaviour .
有关宏困难的更多示例,请参阅 Macro Pitfalls .
由于这些原因,通常最好使用函数而不是宏。
关于c++ - 算术表达式上下文中的宏扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13718291/