| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 686 人关注过本帖
标题:[求助]一道有关宏的题目,怎么考虑这类问题?
只看楼主 加入收藏
damofei
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2006-5-10
收藏
 问题点数:0 回复次数:6 
[求助]一道有关宏的题目,怎么考虑这类问题?

设有以下宏定义:
#define N 3
#define Y(n) ((N+1)*n)
则执行语句:z=2*(N+Y(5+1));后,z的值为
A)出错 B)42 C)48 D)54

2006-12-12 10:43
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
D是么???
展开呗
宏已经是危险代码了
答案无所谓的

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-12-12 11:42
damofei
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2006-5-10
收藏
得分:0 

答案是48,?!


思想有多远,就能走多远!
2006-12-12 14:32
beyond86
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2006-12-11
收藏
得分:0 

#define n 3就是令N=3
底下依次展开就知道结果了


2006-12-12 14:44
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
预处理指令在编译前执行,
经过预处理后的程序,
其中一部分非亲自所写的代码会加入到源程序文件中(使用 include 指令),
此外还有符号的替换(使用 define 指令)与条件编译(ifndef 等)。

define 指令(即宏)遵循替换的原则是:
按被替换的字符串直接替换宏标识符。

#define N 3 /*对于编译器而言,这个3是字符串,而不是数字*/
#define Y(n) ((N+1)*n) /*带有参数的宏,其参数也遵循宏替换原则*/

宏不计算表达式——只需记住这一点,那么在考虑宏引起的问题便变得显浅得多了。

带参数的宏 Y,在其使用处的地方展开,表达式 z=2*(N+Y(5+1)) 将展开为:
z = 2 * (3 + ((3+1)*5+1))

不妨留意一下粗黑体部分,5+1原样替换,5+1 对于编译器而言事实上不过是一条字符串,
替换的过程在编译程序前就已经完成了。这让 5+1 中的 5 先乘了一下,再加1。所求 z 变量值为 48。

使人不解的是结果并不与预计结果相同。
这一般是因为过于相信宏会帮你做更多的事情,甚至觉得在 Y(5+1) 此处帮你算好 5+1 = 6,即理想的 Y(6)。
——这只能算是一厢情愿的想法。

举个差不多相同的例子,有一个宏 Test 被如下声明:
#define Test(N) (N*N)

任意可以编写表达式的地方如此使用该宏:

printf("%d", Test(5+1));

结果是 11 而不是 36。

解决这类尴尬问题的方法是用括号将每个参数都括起来:
#define Test(N) ( (N)*(N) )

如上这样写便能使 Test(5+1) 得到结果 36,
—— 相信大部分人写这个宏的目的是希望结果就是 36,如果不是那你可真是神鬼莫测,让人无法猜出你想干什么了。

使用括号能解决不少问题,包括你讨厌去记的运算符的优先级别,
在程序中适合的地方多多使用也无妨,这样可以抛弃那些令人感觉烦躁枯涩的优先级一边凉快去,
毕竟写程序不是拼谁的记忆力好些,没必要不要为难自己。

[此贴子已经被作者于2006-12-12 15:20:54编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-12-12 15:10
damofei
Rank: 1
等 级:新手上路
帖 子:97
专家分:0
注 册:2006-5-10
收藏
得分:0 

z = 2 * (3 + ((3+1)*5+1))
多谢五楼精辟的解释,我明白了,就是要做最简单的代换!


思想有多远,就能走多远!
2006-12-12 15:21
zhanghuan_10
Rank: 1
等 级:新手上路
威 望:2
帖 子:751
专家分:0
注 册:2006-10-25
收藏
得分:0 
就是把宏名替换成相应的字符串就行了!只是替换!

该学习了。。。
2006-12-12 15:38
快速回复:[求助]一道有关宏的题目,怎么考虑这类问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015140 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved