关于宏的定义注意事项

定义: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

只有这样子我们的程序逻辑才算紧密,特写下,算作日后查阅学习之用。

原文地址:https://www.cnblogs.com/ltlly/p/4110023.html