Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+;中未初始化布尔值的默认值是什么+;_C++ - Fatal编程技术网

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

C++ c+;中未初始化布尔值的默认值是什么+;,c++,C++,假设我有一个名为foo_boolean的结构,其中包含一些布尔值: struct foo_boolean { bool b1; bool b2; }; 如果我定义一个foo_boolean类型的变量而不初始化它,那么成员变量的默认值是什么?(即真、假或两者的随机值。)如果您的意思是bool初始值是未知的则bool的值将是未定义的。它将是在它之前的堆栈上的任何其他内容,如果以前没有使用它,它有时会被调零 但同样,它是未定义的,这意味着它可以是真的,也可以是假的 如果需要默认值,可

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

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();  // <--