宏是文本替换,不做任何计算

看到csdn的一个帖子,总结如下。

 

帖子如下:

 

#define定义的仅仅是“替换”吗?它竟然能计算!

 

[Quote=引用楼主 johnphan 的回复:]
#define five 2+2+1
这个five是在那里计算的呢?
经过程序验证,是在#define five 2+3这句中就计算了。(也就是预处理器preprocessor计算的)
而不是先替换,然后在程序中完成计算的。
但在正式的课本中没有查到有关的论述。
谁能给出这方面的参考资料?
[/Quote]

 

 

 

[Quote=引用 3 楼 arong1234 的回复:]
这和宏没有什么关系
int i = 2+2+1; //这里也是直接就在编译时就计算了,不是说你用了宏因此在宏那里计算了,实际上计算还是文本替换后进行的

引用楼主 johnphan 的回复:
#define five 2+2+1
这个five是在那里计算的呢?
经过程序验证,是在#define five 2+3这句中就计算了。(也就是预处理器preprocessor计算的)
而不是先……
[/Quote]

 

[Quote=引用 4 楼 dragonbooker 的回复:]
提醒楼主:这个宏可能存在问题,如:

#define five 2+2+1

if( five * 2 == 10)
{
  printf("ok/n");
}
else
{
  printf("error/n");
}

你会得到error的输出。
[/Quote]

 

这也证明计算不是宏做的,而是替换之后作的

 

 

你只要记住宏是文本替换,不做任何计算就可以了,你后面那些问题只要你明白这个,就不是问题

 

[Quote=引用 15 楼 johnphan 的回复:]                   这个帖子是错误的,不足以说明楼主的问题,但是帖子本身内容很重要。
还是将老外的这一段文字附在这里,供大家评论吧

面试题目:
用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)

答案:
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL)

在这考察几件事情:
1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等)
2). 懂得预处理器将……
[/Quote]

 

[Quote=引用 16 楼 bluesky12312388 的回复:]
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365UL)
因为这个宏定义用的是乘法,乘法优先级比较高,你将“碰巧”可以证明你那个错误的结论
[/Quote]

 

 

[Quote=引用 22 楼 bluesky12312388 的回复:]
引用 19 楼 bluesky12312388 的回复:

#define FIVE 2+3
#if FIVE < 4 //这个恒为真  2 + 3 < 4 结果为2 + 0 = 2,LZ你真的可以死心了

上面的搞错了,但绝对不是在宏定义的时候计算的
[/Quote]

 

 

[Quote=引用 29 楼 redleaves 的回复:]
宏展开是不会计算的.
但像#if这一类的条件预处理语句会进行简单的表达式求值.
不过还是可以通过一些BT的写法,用宏模拟出一些类似"计算"的行为...
[/Quote]

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值