首页 > 解决方案 > 为什么 C 中的这个宏表达式的行为异常?

问题描述

我正在尝试在代码块 C 编辑器中编写此代码,但输出为 36 而不是 1。

#include <stdio.h>

#define square(x) x*x

int main()
{
    int p=36/square(6);
    printf("%d",p);
}

为什么输出是 36 而不是 1?

标签: cmacros

解决方案


问题是你的宏的定义中没有任何括号——并且宏不像函数那样被“调用”——它们只会导致文本被替换。

因此,在您的代码中,该行:

int p=36/square(6);

替换为:

int p=36/6*6;

它以从左到右的顺序进行评估(因为*and/运算符具有相同的优先级),有效地给出:

int p = (36/6) * 6;

要解决此问题,请在宏定义中添加括号:

#define square(x) ((x)*(x))

随时要求进一步澄清和/或解释。


推荐阅读