C++ 是C/C++;当typecast';从ed到int?

C++ 是C/C++;当typecast';从ed到int?,c++,c,boolean,C++,C,Boolean,许多编译器似乎只在bool值中保留0或1,但我不确定这是否始终有效: int a = 2; bool b = a; int c = 3 + b; // 4 or 5? 是C/C++ 没有名为C/C++的语言 当类型转换为int时,布尔类型始终保证为0或1 C++中的是因为区段$4.5/4表示 bool类型的右值可以转换为int类型的右值,false变为零,true变为一 intc=3+b//4还是5 c的值为4C99之前的c中没有布尔类型(如C90),但是C99/c++中的布尔类型始终保证

许多编译器似乎只在bool值中保留0或1,但我不确定这是否始终有效:

int a = 2;
bool b = a;
int c = 3 + b; // 4 or 5?
是C/C++

没有名为C/C++的语言

当类型转换为int时,布尔类型始终保证为0或1

C++中的是因为区段$4.5/4表示

bool类型的右值可以转换为int类型的右值,false变为零,true变为一

intc=3+b//4还是5


c的值为4

C99之前的c中没有布尔类型(如C90),但是C99/c++中的布尔类型始终保证为0或1

在C语言中,无论布尔类型是否定义,所有布尔运算都保证返回0或1

所以
a&b
!无论是< C++ > >代码> >代码> b>代码> < < /代码>或>代码> a或b >代码> 0或1,C或C++总是返回。
C++中的P>(4.5/4):

bool类型的右值可以是 已转换为int类型的右值, 假变为零,真变为真 成为一个

在C语言中,当一个值转换为
\u Bool
时,它变为0或1(§6.3.1.2/1):

将任何标量值转换为 _Bool,如果值比较等于0,则结果为0;否则 结果是1

当转换为
int
时,非常简单
int
可以容纳0和1,因此值没有变化(§6.3.1.3)。

嗯,不总是

标准3.9.1§6中列出了这种明显奇怪输出的原因:

bool
类型的值为
true
false
。以本国际标准描述为“未定义”的方式使用
bool
值,例如通过检查未初始化的自动对象的值,可能会导致其表现为既不是
true
也不是
false


当你离开安全船时,还有一个例子:

  bool b = false;
  *(reinterpret_cast<char*>(&b)) = 0xFF;
  int from_bool = b;
  cout << from_bool << " is " << (b ? "true" : "false");

要添加到带有填充位的。

类型中,如果填充位不包含该类型的预期值,则该类型的行为可能会异常。大多数C89实现没有将填充位用于任何整数类型,但C99要求实现定义这样一种类型:
\u Bool
。当所有位都为零时,读取一个
\u Bool
将产生零。将任何非零值写入
\u Bool
会将其位设置为某种模式,读取时将产生1。写入零会将位设置为一种模式(可能是也可能不是所有位都为零),读取时将产生0

除非在实现的文档中另有规定,否则通过将零值或非零值存储到
\u Bool
而不能产生的除所有零位以外的任何位模式都是陷阱表示;标准没有说明如果试图读取这样的值会发生什么。给定,例如

union boolChar { _Bool b; unsigned char c; } bc;

将零存储到
bc.c
并读取
bc.b
将产生零。将零或一存储到
bc.b
bc.c
设置为值,如果写入,将导致
bc.b
保持零或一。将任何其他值存储到
bc.c
并读取
bc.b
将产生未定义的行为。

除了在c中,c甚至没有bool类型:)@hhafez:在c中,直到C99,没有bool数据类型。请取消您的否决票。C99在标题
中定义了一个新类型
\u Bool
和一个typedef
Bool
。如果您没有
#include
,您的程序就不能使用
bool
,但它们可以使用
\u bool
-1来指出没有称为C/C++的语言。这句话学究般地正确,但故意无益。这并不是说最初的海报提到了C/SQL。如果你知道C++而不是C标准,就说出来。@ THB我不同意这个评论是没有帮助的。C++是具有更多特征的C的概念非常普遍。这两种语言的标准在许多方面不同,这是一个重要的考虑因素。C确实有
bool
。从技术上讲,类型是
\u Bool
,而
Bool
是一个宏,但这通常并不重要,除非您使用的是冲突的库。@hhafez:C中的标准化布尔类型(\u Bool)比C等语言旧。毕竟,C的经验不多,C与C有什么关系?我不理解C++部分的注释,请参阅[Calc[+](1)(C++)?对于C++,请参阅[BoOL是原生的C类型?]()。我更关心的问题是“布尔表达式总是保证要评估为0或1?”,答案是明确相关的:在较新的C版本中,有一个标准的布尔类型,它只有值0和1,如C++。赋值将非零转换为1。请注意,布尔强制转换将确保
b
为1。但是你仍然可以使用诸如unions、memset等黑客将
b
转换成2。@Sebastian:那么未初始化的变量定义了行为?@hha:注意
int x=b[i]
这行,我真的希望这个随机的东西在这里被转换成0或1。不是吗?不,不是真的,数组只是一块不受限制的内存,里面可以有任何东西,如果你做了bool b[n]={0},那就不同了。然而,您对标准的引用是信息性的,因此+1用于指出exception@Sebastian:尝试访问未初始化的变量是UB@弗雷迪:是吗?我没想到会有什么,毕竟是UB。你真的认为每次访问布尔值时都应该有一个转换步骤吗?除了将
true
false
存储到布尔变量之外,没有定义的方法来存储任何内容。@Sebastian:你完全错了。其他事项,包括终止程序或
系统(“rm-rf/”);
  bool b = false;
  *(reinterpret_cast<char*>(&b)) = 0xFF;
  int from_bool = b;
  cout << from_bool << " is " << (b ? "true" : "false");
  255 is true
union boolChar { _Bool b; unsigned char c; } bc;