C - #define的意外输出

时间:2015-10-23 11:42:52

标签: c output

当我编译以下程序时,我得到输出为47.我期望输出为144

#include<stdio.h>
#define FIRST_PART 7
#define LAST_PART 5
#define ALL_PARTS FIRST_PART + LAST_PART
int main() {
printf ("The Square of all parts is %d", ALL_PARTS * ALL_PARTS) ;
return(0);
}

7 个答案:

答案 0 :(得分:1)

预处理器在编译器之前工作。这是一个简单的“愚蠢”文本替换机制。因此:

  • ALL_PARTS转换为7 + 5

  • ALL_PARTS * ALL_PARTS转换为7 + 5 * 7 + 5

由于这种机制,建议用括号括起宏的参数,并用括号括起整个宏,例如:

#define ALL_PARTS (FIRST_PART + LAST_PART)

答案 1 :(得分:1)

FIRST_PART + LAST_PART将评估为7 + 5(它不会超过文本替换)。

你的表达式是7 + 5 * 7 + 5,即7 + 35 + 5(因为乘法具有比加法更高的优先级)。当然,7 + 35 + 5的值是47。

补救措施是使用(FIRST_PART + LAST_PART)作为您的定义。

答案 2 :(得分:0)

ALL_PARTS * ALL_PARTS

将成为

FIRST_PART + LAST_PART * FIRST_PART + LAST_PART

哪个是

7 + 5 * 7 + 5 = 7 + 35 + 5 = 47

所以47 预期答案。

如果您想查看 预期结果,则需要将()添加到define

#define ALL_PARTS (FIRST_PART + LAST_PART)

答案 3 :(得分:0)

您的预处理器评估为

printf ("The Square of all parts is %d", ALL_PARTS * ALL_PARTS) ;

然后

printf ("The Square of all parts is %d", FIRST_PART + LAST_PART * FIRST_PART + LAST_PART) ;

然后

printf ("The Square of all parts is %d", 7 + 5 * 7 + 5) ;

所以你的最终结果是47

要获得所需的结果,您可以使用

#define ALL_PARTS (FIRST_PART + LAST_PART)

答案 4 :(得分:0)

只需改变一下:

#define ALL_PARTS FIRST_PART + LAST_PART

对此:

#define ALL_PARTS (FIRST_PART + LAST_PAR)

答案 5 :(得分:0)

FIRST_PART是7 LAST_PART是5

FIRST_PART + LAST_PART是7 + 5

7 + 5 * 7 + 5 = 7 + 35 + 5 = 47

要修复,请执行

#define ALL_PARTS ( FIRST_PART + LAST_PART )

答案 6 :(得分:0)

您的代码扩展为7 + 5 * 7 + 5 = 7 + 35 + 5 = 47。 这是一个非常普遍的失败。