博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
宏带来的副作用
阅读量:6313 次
发布时间:2019-06-22

本文共 599 字,大约阅读时间需要 1 分钟。

hot3.png

#define MIN(A,B) (A)<(B) ? (A) :(B);bool aa = 3 < MIN(2,3);
#define MIN(A,B) ((A)<(B) ? (A) :(B));bool bb = 3 < MIN(2,3);

上面代码本身的意图是,将3与2,3的较小者进行大小比较。aa,bb的期望的值应该是false。但是上面代码的结果却并非如此(真实情况:aa=true,bb=false)。注意第一段代码与第二段代码的区别在于,第二段代码将整个宏用括号括起来了,作为一个整体,而第一个则没有。

到底是为什么呢?我们将宏直接替换的规则,代码被替换如下:

[1] bool aa = 3 < 2 < 3 ? 2:3;[2] bool bb = 3 < (2<3?2:3);

显然bb与正常想法一致,很好理解。[1]中,根据小于号的左结合原则,先计算3<2 结果为false(被当作0)再参与接下来的计算即,

aa = 0<3?2:3;

结果为2,被转换为bool型时,aa=true。这就是原因所在,如果将aa的类型改变为int,可以发现aa的最终值为2。足以证明分析结果。

p.s:这个问题是在刷POJ过程中定义了宏被WA掉后发现的,所以在使用宏的时候特别要注意其所带来的副作用。

转载于:https://my.oschina.net/u/736284/blog/324067

你可能感兴趣的文章
MySQL Cluster搭建与测试
查看>>
python数据分析画图体验
查看>>
军规15 确保集成和调用第三方APP
查看>>
Etcd和ZooKeeper,究竟谁在watch的功能表现更好?
查看>>
Shredding Company 碎纸机,dfs()枚举每一种情况,再加剪枝。
查看>>
命名空间和模块化编程 - C++快速入门39
查看>>
结构化程序设计03 - 零基础入门学习Delphi12
查看>>
今天才知道怎么插入代码!!!!!!!!!
查看>>
D2007在64位Win7出现 delphi 2007 assertion failure thread32.cpp 的解决办法
查看>>
STM32的TAMPER-RTC管脚作为Tamper的使用[转]
查看>>
[记]一个逐步“优化”的范例程序
查看>>
2012-01-09_2
查看>>
数学 - 线性代数导论 - #5 矩阵变换之置换与转置
查看>>
java数据结构:队列
查看>>
struts第六结
查看>>
公文管理解决方案
查看>>
使用sed插入tab
查看>>
ansible hosts文件详解
查看>>
屏幕录像专家录制超清视频教程如何解决转码后不清晰问题
查看>>
iotop命令性能监测与优化
查看>>