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时,永远不会有理由将其设置为未初始化,所以这不是我要担心的事情
A bool只有两种状态:true或false.因此,这将是一个可怕的选择,当你需要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)的值
你不能; 这是一种幻觉.无论如何,了解这些价值并没有任何好处.它们毫无意义.bool是true,或者是false,期间.如果您找到某种方法来确定除此之外的其他值,那么您的工作范围超出了规范和未定义行为的范围.编译器严格地在C++规范的范围内工作,以允许诸如优化之类的事情.当你依赖于某些规范之外的东西时,你就会陷入一个受伤的世界.
你改变平台,你的代码默默地破坏.
您更改了优化设置,您的代码会默默地中断.
您在项目的完全不同的部分更改了一小段代码,您的代码会默默地中断.
没有办法概括未初始化的价值.您发现在您的情况下它可能是204或205.你怎么知道你的编译器也不会生成206?你不能.
同样,你怎么知道你的编译器的二进制表示true不是204?再说一遍,你做不到.
最重要的是,您应该只使用明确定义的数据类型以您希望的方式工作.有字面上没有缺点比使用更好的数据类型bool.