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

时间:2014-11-30 18:17:01

标签: c++ initialization boolean

我正在开发一个程序,我需要一个只有三个状态的变量,未触及(未初始化),true和false,所以显然布尔值将是最佳选择。但在确定bool是否未受影响时,我遇到了一些问题。我很快发现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];

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

编辑:当我的程序设置为true或false时, NEVER 是将其设置为未初始化的原因,因此这不是我必须担心的事情< / p>

1 个答案:

答案 0 :(得分:7)

bool仅包含两种状态:truefalse。因此,当您需要3个州(truefalseuninitialized)时,这将是一个糟糕的选择。为此,我建议enum

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


编辑:

为什么在想要检测超过2个状态时甚至考虑bool?您只是选择了错误的数据类型。如果希望最小的数据类型表示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.
    ...
};

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

从下面的评论中

  

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

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

您更改平台,您的代码会默默地中断。

您更改了优化设置,您的代码会无声中断。

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

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

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

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