#define函数给了我意想不到的结果

时间:2016-12-18 10:47:14

标签: c

我使用#define定义了一个函数,但是当我打印出一个简单的操作结果时,它会给我一个意想不到的结果。这是代码:

#include <stdio.h>

#define CUBE(x) (x * x * x)

int main() {
int m, n = 3;
m = CUBE(n + 1);
printf("%d %d", m, n--);
return 0;
}

打印的结果是10和3,我不明白为什么。既然它将n乘以3倍,然后加1,那么结果应该是28和3?

3 个答案:

答案 0 :(得分:1)

你没有#define个函数,你#define个宏,而且这些函数与函数完全不同。

  1. 他们没有被召唤。在编译器编译代码之前,它们由预处理器直接扩展为源代码。

  2. 他们必须注意pitfalls。要命名一个,如果您将带有副作用的表达式传递给宏,则多次使用其参数,副作用多次出现,并且您可能会得到错误的结果。

  3. 变电站是普通的令牌替换,所以

    CUBE(n + 1)
    

    将扩展到:

    (n + 1 * n + 1 * n + 1) 
    

答案 1 :(得分:0)

#define CUBE(x) ((x) * (x) * (x))

应该给你预期的结果。

在您的预处理中,x中的CUBE(x)3+1 替换为}

}

(3+1 * 3+1 * 3+1) // this happens during pre-processing, not in run time

因为宏是纯文本替换。

将按

分组
(3+(1 * 3)+(1 * 3)+1)

给你10。对于更复杂的情况,我建议编写一个函数。

答案 2 :(得分:0)

正如上一个答案已经提出的那样,你缺少一对括号, 因为预处理器基本上找到并替换。所以您的版本结果为

m = n + 1 * n + 1 * n + 1
你观察到

评估结果。

#define CUBE(x) ((x) * (x) * (x))

您将获得

的正确计算
m = (n + 1) * (n + 1) * (n + 1)