神奇的 bool

今天跟同事一起debug,发现一个神奇的事情,在 VC10 的调试器里,两个 bool 变量都是 true,但是程序执行时却走了它们不相等的路径。来看代码:
class Foo
{
public:
    Foo(void) {}

    bool Bar(bool flag) { return flag == _flag; }

private:
    bool _flag;
}
断点下在 Bar() 函数内,调试器显示两个变量都是 true,但是返回的值却是 false!没错!程序 rebuild 过了,眼镜也擦过了!

我会告诉你 Foo::_flag 忘了初始化了么?

噢,对啊。但是,当时调试的时候,他们都是 true 啊!!为什么不相等?让我们来翻看 C++ 标准文档。

关于 bool 类型,3.9.1/7 里是这么说的:

Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively called integral types.

说白了,bool 也是个数。(我一直以为 bool 类型会什么特殊优化)

关于 sizeof(),5.3.3/1 里是这么说的:

sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1. The result of sizeof applied to any other fundamental type (3.9.1) is implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and sizeof(wchar_t) are implementation-defined. *74 ] *74: sizeof(bool) is not required to be 1.

除了 char 的大小,其他所有基础类型的大小都是由实现决定。由!实!现!决!定!(C++ 你就把我往死里坑吧)

而就我所知的编译器(其实我只知道两个),bool 默认都是一个字节。所以从内存的角度来说,它完全可以表示 254 个非“零”值。那么,一个值为 1 的 bool 变量和一个值为 100 的 bool 变量,他们相等么?上面都说了,bool 类型是数!字!类!型!

微软似乎也发现了这个秘密(我有告诉过他们么?),所以在 VS2012 里,调试器会把非 0 且非 1 的 bool 变量的具体值显示出来,而不再是简单的判断一个 bool 值是否是非零了。

泪奔吧,骚年!

文章来源:http://wutiam.net/notes/183

原文链接: https://www.cnblogs.com/islet8/archive/2013/04/11/3014621.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    神奇的 bool

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/84152

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午9:26
下一篇 2023年2月9日 下午9:26

相关推荐