?本题是输入整数或表达式进入宏定义和函数来求面积的。若将输入的半径改成表达式则会因为宏定义与函数的不同,有所区别。
因为宏定义是直接替换,所以例如输入为确定的值时,宏定义和函数的编写可以没有区别,例如下面的代码,输入为具体的整形数:
#include<iostream>
using namespace std;
#define Pie 3.14159; //无参宏
#define AREA r*r*Pie; //无参宏,算式的替换
#define Area(r) r*r*Pie; //有参宏
float area(int r) //因为返回的面积是小数·
{
return r*r*Pie;
}
int main()
{
int r;float s;
cout<<"请输入圆的半径r,输出圆的半径\n";
cin>>r;
cout<<"圆的面积为:\n";
cout<<area(r)<<'\n'; //可以直接套用函数输出
s=AREA; //调用无参宏来计算,直接替换成s=r*r*Pie再计算出的结果
cout<<s<<'\n';
s=Area(r); //调用了有参宏,替换入公式计算
cout<<s<<endl;
return 0;
}
但半径为表达式时,例如半径为 a+b 时
int a=1,b=2;
float s=Area(a+b)
*注意:宏定义是直接替换的,
则?#define Area(r) r*r*Pie;的宏调用为? ?
?s=Area(a+b)=a+b*a+b*Pie=1+2*1+2*3.14=9.28
这与我们所预期要的结果不一样,所以要加()使得将输入的表达式先进行运算。
改成? ??s=Area(a+b)=(a+b)*(a+b)*Pie
#define AREA (r)*(r)*Pie;
#define Area(r) (r)*(r)*Pie;
但函数不用,因为函数调用输入的是计算后的值。
|