为什么是一个bool类型的2d数组不持有0和1?



我运行程序,看到值并不总是0和1。但这是bool数据类型,对吧?

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
bool arr[5][5];
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
return 0;
}

您没有初始化数组,打印的值是垃圾存储在您声明的数组所在的内存中,由于您没有初始化它,因此我们无法知道那里有什么。

请注意,bool的大小是实现定义的,因此在打印数组的初始化成员时,我们无法真正猜测上述未定义行为的值范围。

我们通常看到的行为是编译器使用最有效的可用类型,通常意味着无符号1字节/8位宽的类型。在这种情况下,您可以期望未初始化的值在0到255的范围内。

要初始化数组中的所有值,可以这样做:
bool arr[5][5]{};

通过这个值初始化,数组将被初始化为0,程序将输出:

0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 

您可以使用boolalpha来实际打印truefalse:

的例子:https://godbolt.org/z/xvh67jWWK

由于读取未初始化的值而遇到未定义行为。

UB的存在使得程序行为没有意义。您看到随机垃圾不只是0或1的原因是因为bool占用了一个字节,而不是一个位。编译器不会对此进行补偿,因为在一个有效的程序中,这种情况是不可能发生的,所以没有必要做额外的工作。

如果正确初始化bool数组,问题将得到解决:

bool arr[5][5] = {};

参见这个相关问题,其中,由于UB abool同时是truefalse

最新更新