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

标签 c++ c

我在一个网站上看到了下面的代码。 我无法理解结果是如何作为 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/

相关文章:

c++ - 如何正确初始化不可默认构造的类成员?

c++ - 如何使用 OpenSSL 的 SHA256 函数

c - 使 C 中的其他函数可以访问变量

c - 在 C 中实现 << 重定向

c++ - valgrind 中的一些错误

c++ - 与 MPIR 相比,GMP 有什么优势吗?

c - 给指针赋值?

c - 如何从头文件访问枚举到 C 中的主程序?

c++ - 使用指向函数的指针数组创建结构

c++ - 如何在初始化时仅针对特定对象继承和更改类?