学习《面向对象程序设计——刘正林 著》—— #define 预处理语句出现的奇怪现象

在刘先生所著的《面向对象程序设计》中提到,由于#define预处理器没有较好的检查机制,使得在预处理语句中的宏定义会存在程序瑕疵,书中所举列子如下:

#include <iostream>
using namespace std;

#define MAX(x, y) ((x) > (y)) ? (x) : (y)
void main()
{
	int a(7), b(0), c, d;
	cout << " (1) a = " << a << " , b = " << b << endl;
	c = MAX(++a, b); 
	cout << " (2) a = " << a << " , b = " << b << " , max = " << c << endl;
	d = MAX(++a, b + 12);
	cout << " (3) a = " << a << " , b = " << b << " , max = " << d << endl;
	getchar();
}

此代码运行的结果是:

显然在MAX(++a, b);处把a加了两次,而在 MAX(++a, b + 12);处a只加了一此,为什么会这样?

经过认真阅读代码,发现第一处使用MAX时,++a是大于b的,即x>y,那么最后的返回值还是++a,由于预处理器没有完善的检查机制,使得a再加一次,而第二次则是b+12大,所以++a只执行了一次。为了验证此想法,修改代码如下:

#include <iostream>
using namespace std;

#define MAX(x, y) ((x) > (y)) ? (x) : (y)
void main()
{
	int a(7), b(0), c, d;
	cout << " (1) a = " << a << " , b = " << b << endl;
	c = MAX(++a, b); 
	cout << " (2) a = " << a << " , b = " << b << " , max = " << c << endl;
	d = MAX(++a, b + 7);
	cout << " (3) a = " << a << " , b = " << b << " , max = " << d << endl;
	getchar();
}

运行结果如下:

由于++a = 8,b + 7 = 7,所以x > y,使得++a又执行了两次。

另外,书中给出的采用内联函数的解决方案如下:

#include <iostream>
using namespace std;

inline int max( int x, int y )
{ return x > y ? x : y; }

void main()
{
	int a(7), b(0), c, d;
	cout << " (1) a = " << a << " , b = " << b << endl;
	c = max(++a, b); 
	cout << " (2) a = " << a << " , b = " << b << " , max = " << c << endl;
	d = max(++a, b + 12);
	cout << " (3) a = " << a << " , b = " << b << " , max = " << d << endl;
	getchar();
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值