c语言求救

#include<stdio.h>
#define FUDGE(y) 2.84+y
#define PR(a) printf("%d",(int)(a))
#define PRINT1(a) PR(a);putchar('\n')
void main()
{
int x=2;
PRINT1(FUDGE(5)*x);
}
为什么答案是12,百思不得其解中。。。

你用的都是宏定义,宏定义编译的时候替换的。具体到你这个问题,PRINT1(FUDGE(5)*x);
是这样替换的,FUDGE(5)*x这个整体作为参数宏定义里的参数a,这里面还有一个参数宏FUDGE(5),它是这么替换的,2.84+5。而在PRINT1这个宏里,替换后的参数为2.84+5*2。又因为你是int类型,所以输出为12。
一些建议:
宏里面只是简单替换,不会帮你改变运算顺序,如果需要请用小括号改变相关运算顺序。
PRINT1(FUDGE(5)*x);修改为PRINT1( ( FUDGE(5) ) *x);看看。
宏参数记得加上小括号。#define FUDGE(y) 2.84+y中的y写成 2.84+(y)
希望对你有所帮助。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-27
宏展开后就是:
y就是5
FUDGE(5)就是2.84+5
a就是FUDGE(5)*2=2.84+5*2
PR(a)就是printf("%d",(int)(2.84+5*2))----就是输出12
PRINT1(FUDGE(5)*x);就是先输出12,然后换行(putchar('\n'))本回答被网友采纳
第2个回答  2012-06-17
FUDGE(5) 会被替换为 2.84+5
所以 PRINT1的参数FUDGE(5)*x 是 2.84+5*x,乘法优先级高,所以5.x先计算,参数表达式值是 12.84, 转成整数是12.追问

你好,很感谢你的回答。我还有一点想不明白。这个程序我看不懂,
#define PR(a) printf("%d",(int)(a))
#define PRINT1(a) PR(a);putchar('\n')
PR(a)有什么用呢?

追答

PR(a) define为 printf("%d, (int)(a))
替换时,第二行会变为:
#define PRINT1(a) printf("%d", (int)(a));putchar('\n')

没有PR, 只会输出一个'\n', 不会输出a

第3个回答  2012-06-18
不会先计算2.84+y,是把2.84+y*x一起计算,也就是(int) (2.84+5*2)结果是12
相似回答