恐怖的代码,以及转载

来源:互联网 发布:阿里云香港服务器ping 编辑:程序博客网 时间:2024/04/30 16:33
项目中看到这样的代码:

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嘛,本来就有那么一点露阴癖的意思.只是,咱们既然露了,那看的人总该知道是谁在露是不是?
原创粉丝点击