C++ c+;中未初始化布尔值的默认值是什么+;
假设我有一个名为foo_boolean的结构,其中包含一些布尔值:C++ c+;中未初始化布尔值的默认值是什么+;,c++,C++,假设我有一个名为foo_boolean的结构,其中包含一些布尔值: struct foo_boolean { bool b1; bool b2; }; 如果我定义一个foo_boolean类型的变量而不初始化它,那么成员变量的默认值是什么?(即真、假或两者的随机值。)如果您的意思是bool初始值是未知的则bool的值将是未定义的。它将是在它之前的堆栈上的任何其他内容,如果以前没有使用它,它有时会被调零 但同样,它是未定义的,这意味着它可以是真的,也可以是假的 如果需要默认值,可
struct foo_boolean {
bool b1;
bool b2;
};
如果我定义一个foo_boolean类型的变量而不初始化它,那么成员变量的默认值是什么?(即真、假或两者的随机值。)如果您的意思是
bool
初始值是未知的则bool
的值将是未定义的。它将是在它之前的堆栈上的任何其他内容,如果以前没有使用它,它有时会被调零
但同样,它是未定义的,这意味着它可以是真的,也可以是假的
如果需要默认值,可以执行以下操作:
struct fool_bool {
bool b1;
bool b2;
fool_bool() {
b1 = true;
b2 = false;
}
};
这将使b1默认为真,b2为假。它将生成随机数,为什么?因为我用g++测试了它:
#include <iostream>
using namespace std;
struct fool_bool
{
bool a;
bool b;
};
int main(int argc, char **argv)
{
fool_bool fb1;
cout << fb1.a << " : " << fb1.b << endl;
}
#包括
使用名称空间std;
结构傻瓜布尔
{
布尔a;
布尔b;
};
int main(int argc,字符**argv)
{
傻瓜布尔fb1;
根据我的理解
如果您将对象声明为全局或静态,那么这些值应初始化为false
否则,值不会初始化(基本上可能是真/假)。来自标准文档,3.9.1.6
bool类型的值为true或false。47)
(47)
以本国际标准描述为“未定义”的方式使用布尔值,例如通过检查未初始化自动变量的值
变量,可能会使其表现为既不正确也不错误。
因此,它是未定义的。这取决于您如何创建它
void foo(){
在VS 2012中,如果不初始化bool变量,您将遇到错误C4700:使用了未初始化的局部变量“temp”
然而,在VS 2005中,它将允许您进行构建,但在运行时您将遇到以下错误:运行时检查失败#3-未定义变量“a”。
正如许多人已经说过的,在这种情况下,bool
的值将未定义
除此之外,bool
依赖于实现,您很难猜测结果会是什么,因为您知道,除此之外,bool
将获取堆栈上的值
如果我们假设有1个字节来存储bool
,0表示false,否则表示true,那么您将有:
- 254/255获得真实数据的概率
- 获得错误消息的概率为1/255
因此,通过特定的实现,即使您无法确定,您也可能会得到一个真实的结果(当然,这也取决于堆栈中的位置)
但在这一点上,这只是猜测:答案是未定义的,正如其他人所说的那样
您将有true
或false
当声明为全局或静态时,为什么会将其初始化为false?@Haiyuan:标准规定“具有静态或线程存储持续时间的对象初始化为零”。正如@MBZ回答中的注释所述,这是不正确的。布尔值可以是“未知的”,即既不是真的也不是假的。事实上,直到几分钟前我才知道这一点。将这样的布尔值与真或假进行比较总是返回真(尽管我不知道它是指定的还是取决于编译器)。非常奇怪!你的编译器是否将你的“:”改为,
?这篇文章被投了这么多的反对票,真是太遗憾了。虽然没有明确说明,但这回答了OP的问题,表明该值将是未定义的。虽然有些解释会很好,但他的答案是正确的。这是已知的-是真是假,但是Tundefined@Chris不,它甚至不能保证bool有任何价值。它可能包含一个既不表示正确也不表示错误的位模式。@Johannes:是的,我在写下我的评论后读到了提到标准的答案。如果能找到一个使这成为可能的体系结构,我会很感兴趣。@ChrisBednarski我被这个问题绊倒了事实上,今天的例子(这让我首先想到这里)。第一个条件是if(variable&&somethingElse)
,它的计算结果为false
,而下一个条件是else if(variable)
计算结果为true
。调试器声明该值为42,并且仅在将语言数据传输到外部设备时发生。现在尝试调试该值!:D(哦,它在ARM7平台上)
void foo () {
fool_boolen x; // <---
fool_boolen x; // <--
void foo2 () {
static fool_boolen y; // <--
fool_boolen z = fool_boolen(); // <--