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

时间:2010-10-02 10:56:19

标签: c++

假设我有一个名为foo_boolean的结构,它包含一些布尔值:

struct foo_boolean {
    bool b1;
    bool b2;
};

如果我在没有初始化的情况下定义foo_boolean类型的变量,那么成员变量的默认值是多少? (即真实,虚假或两者的随机值。)

9 个答案:

答案 0 :(得分:16)

这取决于你如何创建它。如果结构由 default-initialization 构成,例如

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

然后值未定义(如果在设置值之前读取它会发生错误)。

另一方面,如果结构由值初始化零初始化构成,例如

fool_boolen x;   // <--

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

然后值将为零,即 false

答案 1 :(得分:9)

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

但同样,它是未定义的,这意味着它可以是真或假。

如果您需要默认值,可以执行以下操作:

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

这使得b1默认为true,b2为false。

答案 2 :(得分:6)

来自标准文档, 3.9.1.6。

  

bool类型的值为true或false.47)

47)

  

将本国际标准所描述的bool值用作“未定义”,例如检查未初始化的自动值   变量,可能会导致表现得好像既不是真也不是假。

所以,它是未定义的..

答案 3 :(得分:2)

会产生随机数,为什么?因为我用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 所以很容易搞清楚!

答案 4 :(得分:1)

如果您的意思是bool,则初始值未知

答案 5 :(得分:0)

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

bool依赖于实现的基础上,您几乎无法猜测会产生什么结果,因为知道bool将会获取栈中的值

如果我们假设有1个字节来存储bool,并且我们为false则为0,否则为true,那么您将:

  • 获得真实结果的概率为254/255
  • 获得错误的概率为1/255

因此,使用特定实施方式,即使您不确定,也可能可能得到正确的结果(当然,这也取决于那是什么)在堆栈中的位置。

但这只是一个猜测:答案是未定义,正如其他人所说。

您将拥有true false

答案 6 :(得分:0)

当我用两个布尔值创建结构时很有趣

struct test {
  bool x;
  bool y;
};

将它们添加到向量中并稍后迭代 - 仅将值 x 设置为 true 并打印它们发现默认值通常为 '0' 表示 false 但当其中一个显式设置为 true 时,另一个成员也会导致'1' 表示正在使用堆栈中的最后一个值。

这可能是一个如此痛苦的错误 - 很高兴被一些单元测试发现。

答案 7 :(得分:-1)

在VS 2012中,如果您没有初始化bool变量,则会遇到错误C4700:uninitialized local variable 'temp' used

但是,在VS 2005中,它允许您构建,但在运行时,您将遇到此错误:Run-Time Check Failure #3 - The variable 'a' is being used without being defined.

答案 8 :(得分:-2)

根据我的理解,

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

否则,值不会被初始化(基本上可以是true / false)。