【C语言】用(#define)宏定义表达式写出加法、交换函数

#define宏

1. 用宏定义表达式完成加法运算函数
#define ADD(x,y) ((x)+(y))

宏会替换到调用宏函数的地方,这是毋庸置疑的。

  1. 为什么x+y的整体要加上() ?
  2. 那么为什么参数x,y要加上() ?
    我们来结合代码看一下吧。
#define ADD(x,y) x+y
int main()
{
	int x1 = 3;
	int x2 = 5;
	printf("%d\n", ADD(x1,x2)*ADD(x1,x2) ); //被替换为 3+5*3+5 = 23
}

结果
在这里插入图片描述
分析:
我们预期的结果应该是 8 * 8 = 64, 为什么是23呢? 因为它被替换为 3+5 * 3+5 = 23 。所以我们要加上(), (3+5)*(3+5)才等于64,我们期待的答案。所以x+y的整体要加上()。

  1. 那么为什么参数的x,y都要加上() ?
    因为运算符的优先级不一样,参数x,y可能是表达式
#define ADD(x,y)  (x + y)
int main ()
{
	int x1 = 1;
	int x2 = 2;
	printf("%d\n" , ADD(x1|x2,x1|x2)); //被替换为  1|2 + 1|2 = 3 ;    '+'的优先级比 '|'高 
}

结果:
在这里插入图片描述
分析: 我们预期的结果是3+3 = 6。 但是结果为3。 因为’+'的优先级比 '|'高 。 没有先运算x1|x2 , 所以加上(), (x1|x2)+(x1|x2)。

2. 用宏定义表达式完成两个数的交换
#define SWAP(Type,name,x,y)\     //Type 交换的变量x,y的类型
	Type c##name = x;\
	x = y;\
	y = c##name
	int main()
{
	int a = 0;
	int b = 3;
	printf("a = %d, b = %d\n", a, b);
	SWAP(int, 1, a, b);  
	printf("a = %d, b = %d\n", a, b);
	system("pause");
}

结果:
在这里插入图片描述
分析

我们先来讲一下’’ 和 ‘##’ 符号的作用
’’ : 续航符,宏定义一行没有结束的时候,换行写的时候,在前面一行的末尾加上换行符。
续航符的后面不能加空格或者Tab
’##’: 把两边的符号合成一个符号。 比如在这里就是将变量c和name合成一个变量
#define SWAP(Type,name,x,y)
Type c##name = x;
x = y;
y = c##name
SWAP(int, 1, a, b) 就是
int c1 = a;
a = b;
b = c1;

那么为什么要加上name这个参数?
因为多次调用这个宏的时候,会多次宏替换,会多次定义出变量c,重定义变量,会报错。所以第一调用的时候SWAP(类型,1,x,y), 第二次调用的时候SWAP(类型,2,x, y), 。。。
就会定义出不同的变量 c1, c2, c3 …cn 。

3. 下面运算后x,y,z的值是多少?
#define MAX(a,b) ((a) >(b) ? (a):(b))
int main()
{
	int x = 5;
	int y = 8;
	z = MAX(x++,y++);
	printf("x = %d , y = %d , z =%d\n", x,y,z); // 6, 10 , 9
}

分析:
将MAX的函数替换到main函数中的位置。 z = ((x++) >(y++) ? (x++):(y++));
先x++,此时x=6, 但是返回的是5;
y++, 此时y=9, 但是返回的是8;
z = 5 > 8 ? (x++) ? (y++); // z = 5 > 8 ? (6++) ? (9++);
5 > 8 不成立, 所以y++, 此时 y= 10; 返回的是9。
所以z = 9,y = 10, x = 6

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值