C++ 除了直接赋值0外,为什么bool变量不能设置为0?

C++ 除了直接赋值0外,为什么bool变量不能设置为0?,c++,C++,当bool变量变为零时,我不能溢出。BoOL类型的变量是1字节长,所以我认为当变量存储256时它会溢出,但它不像我预期的那样。 #include<iostream> int main() { bool b = 0; std::cout << sizeof(b) << std::endl; // the result is 1 byte std::cout << b << std::endl; // the r

当bool变量变为零时,我不能溢出。BoOL类型的变量是1字节长,所以我认为当变量存储256时它会溢出,但它不像我预期的那样。
#include<iostream>


int main()
{
    bool b = 0;
    std::cout << sizeof(b) << std::endl; // the result is 1 byte
    std::cout << b << std::endl; // the result is 0


    b = 256;
    std::cout << b << std::endl; // the result is 1,rather than the desired zero

    return 0;
}
#包括
int main()
{
布尔b=0;

std::cout转换为
bool
0
之外的任何数值都会产生
1
/
真值


即使
sizeof(bool)==1,它的语义也与
char

的语义不同可能256不是直接赋值的,而是检查它是否为0。如果是,布尔值将为false(0),否则它将为true(!=0).

将数字类型转换为
bool
的规则很简单:零变为
false
,所有其他值变为
true
。任何一种类型的大小和布局都是无关的

如果您希望使用标准语言:

C++11 4.12:将零值、空指针值或空成员指针值转换为
false
; 任何其他值都将转换为
true


<> p>因为C++标准说了一些(比如懒得挖出确切的引号)“把数值赋给布尔变量,0的值被转换为false,任何其他值都被转换为true”。.

这就是bool类型的工作原理,它可以是零或非零

A
bool
可以在您的平台中使用一个字节,但其值表示只有一个1位,因为只有两个类型的值:
true
false
。不是0,不是1,不是256

<>这是C++标准第3.9-1节中提到的第6段:

bool
类型的值为
true
false
(…)

您可以将0和256分配给
bool
类型的变量,因为
int
bool
之间存在隐式转换。该转换将零转换为
false
,将其他任何值转换为
true
。这就是您在这里看到的

第4.12节规定了这一点:

算术、非范围枚举、指针或指向的指针的PR值 成员类型可以转换为类型为
bool
的PR值。一个零值, 空指针值,或将空成员指针值转换为
false
;将任何其他值转换为
true
(…)

<> >代码> b=256 < /COD>不存储<代码> 256 > />代码>真< /代码>。不能存储<代码> 256代码>代码> BoOL < /C>变量,因为<代码> 256代码>不是Boo> <代码>值。这是C++ <强>不是某种形式的汇编< /强>。<代码> B=256 < /Cord>不代表“将256的低位8位写入变量
b
”所指的内存位置。正如上面的标准引号所示,这意味着“如果256为零,则将
false
分配给变量
b
;否则,将
true

在通用实现中,值<代码> false <代码>以二进制表示,但没有什么可以阻止。一个实现可以自由地选择不同的对象表示,因为这是不相关的:C++代码在不破坏类型系统和不知道实现定义的BEH的情况下不能看到它。aviour.一个实现可以完全有效,并选择0xDEADBABE和0xDEADD00D作为

true
false
的对象表示:只有一位携带值表示。重要的是
bool
是一种表示简单真值的类型。它不是“我们可以用零测试的一堆位。”

试试看

*reinterpret_cast<unsigned char *>(&b) = 256;
*重新解释(&b)=256;

尽管如此,它还是不安全的(
sizeof(bool)
可以是1或4或其他任何值,具体取决于实现).bool是一种系统定义的类型,只能接受true/false或1/0。它占用一个字节的事实是由于当前存储机制的限制:在当前场景中,不可能寻址少于一个字节的数据


为了便于理解:将bool视为一种系统定义的类型,它具有一个重写的赋值运算符。该运算符在内部将任何赋值转换为1/0,因此不会溢出。

现代计算机上最不可寻址的单元是字节,这解释了为什么
sizeof(bool)
是1。但正如R.Martinho Fernandes指出的,它只需要一个位。这是C兼容所必需的:
if(256){printf(“notfalse”);}
仍然需要工作。256占用2个字节,而不是1个字节。@coco:取决于编译器,但无论如何:我使用了与您的示例相同的数字。这是不安全的,因为它有未定义的行为。@R.MartinhoFernandes:我相当确定这是定义的;所有内存都可以用
无符号字符*
(对于
memcpy()是必需的)
要工作,C兼容)。随后尝试读取它是另一回事。