c++:为什么我的布尔值存储的值大于 1?

c++ : Why does my boolean store a value greater than 1?

我正在学习 C++,现在开始学习 classes 的概念。我了解到一个新创建的对象(没有构造函数)将具有随机属性。所以我想测试一下并写了一个简短的代码:

#include <iostream>
#include <vector>

class Person;
class Person {
public:
  bool const isHungry() {
    return hungry;
  }
  bool const isOld() {
    return age;
  }
private:
  bool hungry;
  bool age;
};

int main() {
  Person person1,person2,person3;
  std::vector<Person> persons {person1,person2,person3};
  for (auto i : persons) {
    std::cout << "Hungrig: " << i.isHungry() << ";\t Alt: " << i.isOld();
    std::cout << std::endl;
  }
}

结果是:

洪格里格:96;替代:147

洪格里格:222;替代:46

洪格里格:252;替代:127

所以是的,它是随机的,但现在我有一个新问题: 怎么可能??这是一个布尔值,它应该是 0 或 1!

编辑:我认为我遇到的麻烦是我认为布尔值将大于 1 的整数转换为 1。像这样:

  bool test;
  test= 32;
  std::cout << test << std::endl;

结果总是 1。所以我很困惑为什么它不使用我的 class.

中的布尔值

如果您没有初始化变量,则出现随机值(未初始化)。

全局静态变量如果您没有初始化,则由编译器初始化。 将 false 赋值给变量,或者你可以考虑 Constructor()

And I learned that a new created object (without constructor) will have randomized attributes.

这是错误的。未初始化的成员将具有 不确定的值,直到它们被分配给。尝试读取 不确定值 会导致程序具有 未定义的行为 ,这意味着无法保证程序的行为方式。这不同于简单地产生一个未指定的值。它允许程序以 any 方式运行,无论它是否适合,例如您期望从有效程序中获得的类型约束。

实际上,读取未初始化变量的未定义行为经常表现为产生未指定的值,但这些值也不是随机的。它们是确定性的,是编译器编译无效程序的特定方式的结果。


你是正确的 bool 变量只能有值 01,但是变量占用的内存可能有比这更多的状态,所以有可能多个 对象表示 表示相同的值。例如,bool 变量可能占用整个内存字节,一种可能的解释是该内存的所有状态都是有效的对象表示,其中一个特定位标识 bool 的值。但也可能每个值只有一个有效的对象表示,在这种情况下,读取和打印 bool 的代码可能不会费心提取这样的位并打印 non-sense 如果内存处于该类型的无效状态,例如当您不初始化内存时很可能发生这种情况。