C++ 将布尔值更改为0或1以外的值?

C++ 将布尔值更改为0或1以外的值?,c++,visual-studio-2010,visual-c++,C++,Visual Studio 2010,Visual C++,我有以下代码: #include <stdio.h> int main() { bool b; // Set b to 123 char *p = (char*)&b; *p = 123; // Check if b is considered to be true if (b == true) printf("b is true"); return 0; } #包括 int main() { 布尔b; //将

我有以下代码:

#include <stdio.h>

int main()
{
    bool b;

    // Set b to 123
    char *p = (char*)&b;
    *p = 123;

    // Check if b is considered to be true
    if (b == true) printf("b is true");

    return 0;
}
#包括
int main()
{
布尔b;
//将b设置为123
char*p=(char*)&b;
*p=123;
//检查b是否被认为是正确的
如果(b==true)printf(“b为true”);
返回0;
}
b
不被认为是
true
,因此
true
的确切含义是
true
等于
1



< > > >编辑:< /强>忘记说我使用Visual C++。

< P> <代码>真< /代码>意味着代码> 1

但123也被认为是真的(通常是除零以外的所有整数)

如果你说

if (b) printf("b is true");

您必须获得输出
b为true
true
表示
1

bool b;

// Set b to 123
char *p = (char*)&b;
*p = 123;
但123也被认为是真的(通常是除零以外的所有整数)

如果你说

if (b) printf("b is true");
您必须获得输出
b为真

bool b;

// Set b to 123
char *p = (char*)&b;
*p = 123;
< > C++标准中未指定“代码> BoOL < /COD>如何存储…e、 一个编译器使用一个字节,另一个编译器使用四个字节是完全合法的。此外,一个编译器可能为
false
存储say
0
,为
true
存储所有位,以及另一个
0
1
或任何其他值。重要的是,当在布尔上下文中使用时,逻辑工作正常,并且当转换为
int
时:

  • int(b)
    1
    如果
    b
    true
    0
    如果
    b
    false
    ,以及

  • bool(n)
    true
    当且仅当
    n
    不是
    0

因此,在测试布尔值时,可能会或可能不会参考
bool
表示中最低内存地址处的字符:可能是一个编译器生成的代码使用四字节
int
进行读取,然后只测试最低有效位或字节,根据端部的不同,可能未被
*p=123
触及。类似地,编译器可能会将该值读入有符号整数寄存器,并测试其负性(当
为true
时,期望值为all bits on),即使
*p=123
已写入唯一或最高有效字节,也可能会失败

因此,即使没有其他因素在起作用,下面的一行可能不会报告“b是真的”

…但这项测试还有一个缺陷

  • 可能从未初始化的
    bool
    表示中的其他字节读取(未初始化的内存读取具有未定义的行为)

  • 仅仅摆弄
    bool
    值本身就具有“未定义的行为”;就对
    bool
    内存的“二进制写入”而言,只有来自另一个正确初始化的
    bool
    的完整字节对字节拷贝才能保证该
    bool
    处于可用状态

< > C++标准中未指定“代码> BoOL < /COD>如何存储…e、 一个编译器使用一个字节,另一个编译器使用四个字节是完全合法的。此外,一个编译器可能为
false
存储say
0
,为
true
存储所有位,以及另一个
0
1
或任何其他值。重要的是,当在布尔上下文中使用时,逻辑工作正常,并且当转换为
int
时:

  • int(b)
    1
    如果
    b
    true
    0
    如果
    b
    false
    ,以及

  • bool(n)
    true
    当且仅当
    n
    不是
    0

因此,在测试布尔值时,可能会或可能不会参考
bool
表示中最低内存地址处的字符:可能是一个编译器生成的代码使用四字节
int
进行读取,然后只测试最低有效位或字节,根据端部的不同,可能未被
*p=123
触及。类似地,编译器可能会将该值读入有符号整数寄存器,并测试其负性(当
为true
时,期望值为all bits on),即使
*p=123
已写入唯一或最高有效字节,也可能会失败

因此,即使没有其他因素在起作用,下面的一行可能不会报告“b是真的”

…但这项测试还有一个缺陷

  • 可能从未初始化的
    bool
    表示中的其他字节读取(未初始化的内存读取具有未定义的行为)

  • 仅仅摆弄
    bool
    值本身就具有“未定义的行为”;就对
    bool
    内存的“二进制写入”而言,只有来自另一个正确初始化的
    bool
    的完整字节对字节拷贝才能保证该
    bool
    处于可用状态

  • C++11说(3.9“类型”[basic.Types]):

    一个对象的值表示是一组保存数据的位 类型T的值。对于普通可复制类型,值 表示是对象表示中的一组位 确定一个值,该值是 实现定义的一组值

    和(3.9.1“基本类型”[基本基本类型]):

    对于字符类型,对象表示的所有位都参与 在值表示中。对于无符号字符类型,所有 值表示的可能位模式表示数字。 这些要求不适用于其他类型

    bool类型的值为true或false

    最后,5个“表达式”[expr]表示:

    如果在表达式求值期间,结果不是 文科硕士