恐怖的代码,以及转载

项目中看到这样的代码:

m_optimizedPolygons = false;
if (gdi_compatible && (true == gdi_compatible->value().as_boolean()))
        m_optimizedPolygons = true;

看到什么问题了吗?有没有人吐血身亡?哦,对不起,朋友,帮忙打个120......

无数C++的文章和书籍----至少,我已经数不清看到过多少次类似的讨论了----讨论了和true,false直接比较判等的陷阱,对于bool表达式,不能用==来比较,虽然语法上完全合法.

true 的内部表示是什么?1?-1?oxffffffff?非0?能确定的大概只有一点:非0;gdi_compatible->value(). as_boolean()返回值只有恰好和程序内部的true的表示相等,==比较的结果才是true.显然,as_boolean()并不能确定 true到底物理上怎么表示的,所以,也只是返回一个非0值了事.借助于强制转换很容易测试这一点:

int i = 10;

cout << static_cast<bool&>(i) == true;

输出多半是0,至少我在vc8上是这样,而这个项目使用的正是vc8.

尽管将一个整数转换成bool类型时,编译器可以动态调整内部表示,然而,这也只是在编译器能够判断时才能做出这种调整.例子中的这种情况是例外.另外一个例外是:

if (true == fun());

这个fun是外部模块,例如DLL,什么编译器编译的都不确定.更是无法预测了.

改正很简单:

m_optimizedPolygons = gdi_compatible && gdi_compatible->value().as_boolean();

既简单,又可靠,何乐而不为?

需要记住的是:

bool值之间只应该做bool运算,永远不要用来做其他运算--除非你知道。这里的bool值机包括内置的bool类型,更包括自定义的bool类型。特别的,对于windows中的BOOL类型,往往是内部的short, int8定义来的,这样的类型更危险:

if (foo1() == foo2())如果这两个返回值都是true,但是一个是3,另一个是4,都是true,却不相等, 呜呼哀哉!


今天在论坛看到一篇文章,<<奇技淫巧C++之懒惰计算>>,一看之下,原来是我写的,网上转悠了一圈又回到csdn来了.这年头,被人转载还要说一声"承您看得起咱",况且,写blog嘛,本来就有那么一点露阴癖的意思.只是,咱们既然露了,那看的人总该知道是谁在露是不是?

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 9

打赏作者

wingfiring

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值