gpt4 book ai didi

c++ - 算术表达式上下文中的宏扩展?

转载 作者:可可西里 更新时间:2023-11-01 18:41:21 27 4
gpt4 key购买 nike

我在一个网站上看到了下面的代码。我无法理解结果是如何作为 11 而不是 2513 的。

为什么我想 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com