此问题在此处已有答案:
C macros and use of arguments in parentheses(2个答案)
The need for parentheses in macros in C [duplicate](8个答案)
8天前关闭.
#include <stdio.h>
#define PRODUCT(x) (x * x)
int main (){
int i=3, j;
j = PRODUCT(i + 1);
printf("%d\n",j);
return 0;
}
有人能解释一下为什么输出是7而不是我预期的16吗?
2条答案
按热度按时间ulydmbyx1#
它只是一个标准的预处理器函数-类似宏。
只要用定义替换用法,就可以得到
这当然是个问题。定义应该是
因为参数可能不止一个标记。
6qqygrtg2#
宏只是文本(更准确地说是标记)替换。
因此,在预处理期间替换
PRODUCT(i + 1)
,以而不是从
i + 1 * i + 1
到(i + 1) * (i + 1)
。您需要将其定义为
即使有定义,宏也不会像函数那样运行,例如
将调用未定义的行为,因为它将扩展为
((i++) * (i++))
所以基本上尽量避免像函数这样的宏,除非你真的知道你在做什么。