宏定义详细知识点

本文详细介绍了C++中的宏定义,包括不带参数的宏定义和带参数的宏定义。通过具体示例展示了宏如何进行机械替换,以及在实际编程中可能导致的错误,如未正确使用括号导致的计算问题。还提供了交换两个变量值和求余数的宏定义应用,并给出了解决三角形面积的宏定义方法。文章强调了宏定义的注意事项,如无语法检查和作用域等。

一、不带参数的宏定义

1、格式:

#define 宏名 字符串

例:#define a 6

则a是宏名,凡是出现a的地方均用6替换

2、注意:

宏替换是一种机械替换;不做语法检查,不是下一个语句,其后不加";"

#define命令出现在函数的外面,有效范围是定义处到本源文件结束,可以用#undef命令终止作用域。

进行宏定义时可以用已经定义的宏名,进行层层叠换。

对程序中双引号括起来的字符串内,即使与宏名相同,也不进行置换。

#define a 3
int fun()
{
......
}
#undef a
int main()
{
......
}

二、带参数的宏定义

1、格式:

#define s(a,b) a*b

2、该宏替换也是机械替换

#define s(a,b) a*b

int a=1;int b=2;

data=s(a+b,a+b);

data的值并不等于9而是1+2*1+2=5

3、实际例子:

1、定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。
输出已交换后的两个值。

#include <iostream>
using namespace std;
#define change(a,b) int t=a; a=b; b=t
int main()
{
	int n, m;
	cin >> n >> m;
	change(n, m);
	cout << n << '\t' << m;
}

运行结果: 

2、输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。

#include <iostream>
using namespace std;
#define remainder(a,b) a%b
int main()
{
	int n, m;
	cin >> n >> m;
	int t=remainder(n, m);
	cout << t << '\n';
	return 0;
}

运行结果:

3、三角形面积 = SQRT(S * (S - a) * (S - b) * (S - c)) 其中S = (a + b + c) / 2,a、b、c为三角形的三边。定义两个带参的宏,一个用来求area,另一个宏用来求S,写程序,在程序中用带实参的宏名来求面积area(保留三位小数)​​​​​​​

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
#define fun1(a,b,c) (a+b+c)/2
#define fun2(s) sqrt(s * (s - a) * (s - b) * (s - c))
int main()
{
	float a, b, c;
	cin >> a >> b>>c;
	float s = fun1(a, b, c);
	float area = fun2(s);
	cout << fixed << setprecision(3) << area << '\n';
	return 0;
}

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SweetCinderella

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值