我正在开发一个程序,我需要一个只有三个状态的变量,未触及(未初始化),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>
答案 0 :(得分:7)
bool
仅包含两种状态:true
或false
。因此,当您需要3个州(true
,false
,uninitialized
)时,这将是一个糟糕的选择。为此,我建议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
更好的数据类型确实没有的缺点。