定义:C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。
带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在字符串中含有各个形参。
带参宏调用的一般形式为:
宏名(实参表);
特别注意事项:
如:求(a+1)^2的值,用宏定义;
#include <stdio.h>
#define Square(x) x*x
int main()
{
int x;
int sum;
printf("please input one number
");
scanf("%d",&x);
sum=Square(x+1);
printf("the sum is %d",sum);
return 0;
}
please input one number
23
the sum is :47
???????? 为什么是47?而不是529?
原来是这样子的,x+1带入到宏中变成了------->x+1*x+1 再把x=23带入式子中可得:47。
那又有什么办法可以得到我们需要的x^2呢?办法是有的,如下:
---------------------------------------
第一种方法:
#include <stdio.h>
#define Square(x) x*x
int main()
{
int x;
int y;//------此处增加一个变量用来接收y=x+1的值
int sum;
printf("please input one number
");
scanf("%d",&x);
//---------此处增加y=x+1;
sum=Square(x+1);//-----此处变更下 sum=Square(y);
printf("the sum is %d",sum);
return 0;
}
输出:
please input one number
23
the sum is :529
----------------------------------------
第二种方法:
#include <stdio.h>
#define Square(x) x*x//------此处更改成:#define Square(x) (x)*(x)
int main()
{
int x;
int sum;
printf("please input one number
");
scanf("%d",&x);
sum=Square(x+1);
printf("the sum is %d",sum);
return 0;
}
解析:(x+1)*(x+1)
输出:
please input one number
23
the sum is :529
这样就可以得到我们所想要的答案了,哎对了,是不是这样,我们的程序就算完成了呢?
其实还没有完,假如我们的Square(x+1)/n后,那又会是怎么样的呢?
如下:
#include <stdio.h>
#define Square(x) (x)*(x)
int main()
{
int x;
int sum;
printf("please input one number
");
scanf("%d",&x);
sum=Square(x+1)/2;
printf("the sum is %d",sum);
return 0;
}
输出:
please input one number
23
the sum is :288
解析:从我们本意上来讲,我们应该是529/2=264才对,可答案却是288?
原来现在变成这样子了:(x+1)*(x+1)/2----->带入x=23后,自然答案是288
那么又怎么样变成我们的需求呢?
如下:
#include <stdio.h>
#define Square(x) (x)*(x)//-------此处更改成:#define Square(x) ((x)*(x))
int main()
{
int x;
int sum;
printf("please input one number
");
scanf("%d",&x);
sum=Square(x+1)/2;
printf("the sum is %d",sum);
return 0;
}
输出:
please input one number
23
the sum is :264
只有这样子我们的程序逻辑才算紧密,特写下,算作日后查阅学习之用。