C++ 除了直接赋值0外,为什么bool变量不能设置为0?
当bool变量变为零时,我不能溢出。BoOL类型的变量是1字节长,所以我认为当变量存储256时它会溢出,但它不像我预期的那样。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
#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类型的工作原理,它可以是零或非零Abool
可以在您的平台中使用一个字节,但其值表示只有一个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兼容)。随后尝试读取它是另一回事。