C++中未初始化的布尔值

Cha*_*ich -2 c++ boolean initialization

我正在开发一个程序,我需要一个只有三个状态的变量,未触及(未初始化),true和false,因此很明显布尔值将是最佳选择.但在确定bool是否未受影响时,我遇到了一些问题.我很快发现布尔默认为204或205,但你怎么能说出来?我已经对它进行了一些测试,我注意到在我的一个程序中,它一直是204,但在另一个程序中它是205.

我不确定是什么决定了这个值,以及它的值是否因程序或基于设备和所使用的操作系统而异,但是无论操作系统或设备如何,该值在整个程序中是否一致?就像在,它会起作用吗?

    //for some reason the default is only 204 or 205 when in an array
    bool asdf[1];
    const bool UNDEFINED_BOOL = asdf[0];
Run Code Online (Sandbox Code Playgroud)

而不是使用整个UNDEFINED_BOOL程序的值作为比较,以查看bool(在数组中)是否未定义?它似乎在我的设备上工作,但它适用于所有设备和所有操作系统?这是整个C++中一致的东西吗?还有另一种方法可以找出未定义的bool的值是什么,或者是没有示例你无法确定的东西?

编辑:当我的程序设置为true或false时,永远不会有理由将其设置为未初始化,所以这不是我要担心的事情

ten*_*our 7

A bool只有两种状态:truefalse.因此,这将是一个可怕的选择,当你需要3个州(true,false,uninitialized).为此我会推荐一个enum.

我认为你只是误解了"未初始化"的含义.它不是布尔类型的状态.它字面意思是一个未初始化的变量.使用此值是未定义的行为.


编辑:

你为什么要考虑bool何时想要检测超过2个状态?您只是选择了错误的数据类型.如果希望最小的数据类型表示3个值,则选择可支持至少3个值的最小类型.这可能是uint8_t,或者如果您尝试将其打包到结构中,您可以使用位字段:

enum MyTristate : uint8_t
{
    False = 0,
    True = 1,
    Undefined = 2
};


struct MyStruct
{
    ...
    MyTristate someField : 2;// you only need 2 bits to support MyTristate.
    ...
};
Run Code Online (Sandbox Code Playgroud)

我还要补充一点:您觉得您已经找到了一种方法来利用它bool来检测超过2种数据类型.没有理由尝试利用任何东西.您似乎也处于bool最小数据类型的错误印象之下; 不是.确切的大小是实现定义的,但是你找不到任何存储它的实现小于a uint8_t.

从下面的评论中,

...如果我可以确定未初始化的布尔值(似乎总是204或205)的值

你不能; 这是一种幻觉.无论如何,了解这些价值并没有任何好处.它们毫无意义.booltrue,或者是false,期间.如果您找到某种方法来确定除此之外的其他值,那么您的工作范围超出了规范和未定义行为的范围.编译器严格地在C++规范的范围内工作,以允许诸如优化之类的事情.当你依赖于某些规范之外的东西时,你就会陷入一个受伤的世界.

你改变平台,你的代码默默地破坏.

您更改了优化设置,您的代码会默默地中断.

您在项目的完全不同的部分更改了一小段代码,您的代码会默默地中断.

没有办法概括未初始化的价值.您发现在您的情况下它可能是204或205.你怎么知道你的编译器也不会生成206?你不能.

同样,你怎么知道你的编译器的二进制表示true不是204?再说一遍,你做不到.

最重要的是,您应该只使用明确定义的数据类型以您希望的方式工作.字面上没有缺点比使用更好的数据类型bool.