我使用#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?
答案 0 :(得分:1)
你没有#define
个函数,你#define
个宏,而且这些函数与函数完全不同。
他们没有被召唤。在编译器编译代码之前,它们由预处理器直接扩展为源代码。
他们必须注意pitfalls。要命名一个,如果您将带有副作用的表达式传递给宏,则多次使用其参数,副作用将多次出现,并且您可能会得到错误的结果。
变电站是普通的令牌替换,所以
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)