#include "stdio.h"
#define X(a,b,c) (1.0/2)*(a+b+c)
#define S X(a,b,c)
#define AREA(a,b,c) sqrt(S*(S-a)*(S-b)*(S-c))
#include <stdio.h>
#include <math.h>
int main()
{
int e,f,g;
printf("请输入三角形的三条边:\n");
printf("第一条边:");
scanf("%d",&e);
printf("第二条边:");
scanf("%d",&f);
printf("第三条边:");
scanf("%d",&g);
printf("该三角形的面积是:%f",AREA(e,f,g));
printf("\n");
return 0;
}
哪里错了?为什么?
谢谢你们的回答,可是我就是为了省去写X(a,b,c)才又定义了一个S的,这是做的谭浩强那本书上的宏那章的一个练习,书上不是也可以用宏再定义宏的吗?为什么我这样用就不行?书上一个例子:
#include "stdio.h"
#define PI 3.1415926
#define S(r) PI*r*r
main()
{
float a,area;
a = 3.6;
area = S(a);
printf("r=%f\narea=%f\n",a,area);
}
其中不是也用变量a去替换宏S(r)的参数r了吗?为什么我的程序里再替换一次就不行呢?想不通
那是不是这样理解:
先执行printf("该三角形的面积是:%f",AREA(e,f,g)); 这句时将AREA(e,f,g)替换成sqrt(S*(S-e)*(S-f)*(S-g)),然后再将sqrt(S*(S-e)*(S-f)*(S-g))中的S替换时没有传入相应的a,b,c所有说没找到.
对吧?
但是,预编译是不是按语句的顺序进行的啊?如果是的话,那就应该先把#define AREA(a,b,c) sqrt(S*(S-a)*(S-b)*(S-c)) 句替换成#define AREA(a,b,c) sqrt(X(a,b,c)*(X(a,b,c)-a)*(X(a,b,c)-b)*(X(a,b,c)-c)) 句,不是吗?那主程序里再替换就不会出错了吧?呵呵,麻烦了
谁知道编译预处理的原理?关于宏的?谢谢