当我编译以下程序时,我得到输出为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);
}
答案 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。 这是一个非常普遍的失败。