C++中未初始化的布尔值的默认值是什么?

23
假设我有一个名为foo_boolean的结构体,其中包含一些布尔值:
struct foo_boolean {
    bool b1;
    bool b2;
};
如果我定义了一个类型为foo_boolean的变量,但没有初始化它,那么成员变量的默认值会是什么?(即true、false还是两者中的随机值。)
9个回答

27

这取决于你如何创建它。如果该结构体是通过默认初始化构造的,例如:

void foo () {
  fool_boolen x;   // <---

如果在设置值之前读取它,则这些值将是未定义的(如果在设置值之前读取它,会发生不好的事情)。

另一方面,如果结构是通过值初始化零初始化构建的,例如:

fool_boolen x;   // <--

void foo2 () {
  static fool_boolen y; // <--
  fool_boolen z = fool_boolen();  // <--

那么这些值将会是零,即false


12

bool 的值是未定义的。它将是之前堆栈上的其他内容,如果没有先前使用它,则有时会归零。

但同样地,它是未定义的,这意味着它可以是 true 或 false。

如果你需要一个默认值,可以这样做:

struct fool_bool {
  bool b1;
  bool b2;
  fool_bool() {
    b1 = true;
    b2 = false;
  }
};

这将默认设置b1为true,b2为false。


6

来自标准文档,3.9.1.6.

布尔类型的值只能是true或false。47)

47)

在国际标准中描述为“未定义”的情况下使用布尔值,例如检查未初始化的自动变量的值,可能导致其表现为既不为真也不为假。

因此,它是未定义的。


3

它将生成随机数,为什么?因为我用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;
}

第一次测试显示了121、235,第二次测试显示了34、331。因此很容易理解!


5
你的编译器是否把 : 改成了 , - default
1
很遗憾这篇帖子被投了这么多反对票。虽然没有表述得很清楚,但是它通过展示该值将未定义来回答了提问者的问题。虽然一些解释会更好,但他的回答是正确的。 - psyklopz

1

如果你指的是bool,那么初始值是未知的


它是已知的 - 可能是真的或假的,但未定义。 - Chris Bednarski
2
@Chris 不,甚至不能保证 bool 有任何值。它可能包含一个不代表真或假的比特模式。 - Johannes Schaub - litb
@Johannes:是的,我在写完我的评论后看到了提到标准的答案。找到一种可以实现这一点的架构会很有趣。 - Chris Bednarski
@ChrisBednarski 今天我碰巧遇到了这个问题,这也是我来这里的原因。第一个条件是 if (variable && somethingElse),结果为 false,而下一个条件 else if (variable) 的结果为 true。调试器显示该值为42,只有在将语言数据传输到外部设备时才会发生。现在试着调试一下吧! :D(哦,这是在ARM7平台上) - Refugnic Eternium

0

当我创建了一个包含两个布尔值的结构体时,感觉很有趣。

struct test {
  bool x;
  bool y;
};

将它们添加到向量中并稍后迭代 - 仅将值x设置为true并打印它们两个,发现默认值通常为“0”,表示false,但当其中一个显式地设置为true时,另一个成员也会导致“1”,表明正在使用堆栈的最后一个值。
这可能是一个非常痛苦的错误 - 很高兴被一些单元测试捕获。

0

根据我的理解,

如果您将对象声明为全局或静态,则值应初始化为false。

否则,值未初始化(基本上可以是true/false任意一种)。


为什么全局或静态声明的变量在声明时会被初始化为false? - Haiyuan Zhang
3
“静态或线程存储期的对象将被零初始化”是标准所述。 - aeh
根据@MBZ答案中的评论所述,这是不正确的。布尔值可以是“未知”的,即既不为真也不为假。事实上,在几分钟前我还不知道这一点。将这样的布尔值与true或false进行比较总是返回true(尽管我不知道它是否被规定或取决于编译器)。相当奇怪! - lex82

0

像许多人已经说过的那样,在这种情况下,bool 的值将是未定义的

除此之外,由于 bool实现相关的,你几乎无法猜测出结果可能是什么,因为 bool 的值还将取自堆栈中的位置。

如果我们假设我们有1个字节来存储 bool,并且我们用0表示false,其他则表示true,则会得到以下结果:

  • 获得true的概率为254/255
  • 获得false的概率为1/255

所以在具体实现中,尽管你不确定,但你可能会得到true(当然,这也取决于堆栈上的值是什么)。

但目前只是推测:答案就像其他所有人所说的那样:未定义

你将获得truefalse其中之一。


-1
在VS 2012中,如果您不初始化bool变量,则会遇到错误C4700:未初始化的本地变量“temp”被使用 然而,在VS 2005中,它将允许您构建,但在运行时,您将遇到此错误:运行时检查失败#3-正在使用未定义的变量“a”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接