带有表达式不需要的结果的 C 宏

标签 c macros

我正在运行以下程序并得到结果 9 7,我明白为什么输出是 9 但我不明白为什么输出是 7。

#include<stdio.h>
#define sqr(i) (i*i)

int main()
{
    printf("%d %d", sqr(3), sqr(3+1));
    return 0;
}

对于 sqrt(3+1) 的第二个函数,micro 如何扩展以及我如何获得 7 输出?

最佳答案

您可以让编译器或 IDE 预处理文件并向您展示宏是如何展开的。

在您的例子中,sqr(3+1) 扩展为 (3+1*3+1)。现在 C 运算符的优先级意味着乘法在加法之前完成。所以 (3+1*3+1) -> (3+3+1) -> (7)

您可以通过以这种方式定义宏来解决此问题,并在参数周围加上括号:

#define sqr(i) ((i)*(i))

关于带有表达式不需要的结果的 C 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712140/

相关文章:

指针和整数之间的比较,我该如何解决?它甚至不运行

arrays - C中偶数数组的递归

Java、宏代码、函数地址

c++ - 需要修复我的 Variadic 宏

macros - 术语列表的术语扩展

c - 机器如何理解操作系统内核代码

c - C语言中的(*this)是什么?

c - 如何欺骗预处理器

c - 为什么 MISRA-C 在某些情况下不允许隐式扩大类型?

c++ - 如何创建一个多次使用一个值而不复制它的宏?