bool转换为int

pic*_*c11 118 c c++ c99

这种转换有多便携.我可以确定两个断言都通过了吗?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);
Run Code Online (Sandbox Code Playgroud)

不要问为什么.我知道这很难看.谢谢.

Naw*_*waz 191

int x = 4<5;
Run Code Online (Sandbox Code Playgroud)

完全便携.符合标准.boolint转换是隐式的!

C++标准中的§4.7/ 4表示(积分转换)

如果源类型为bool,则将值false转换为零,并将值true转换为1.


至于C,据我所知bool,C中没有(1999年之前)因此bool,int转换仅适用于C++.在C中,4<5int值为value,在这种情况下,值为1, 4>5 将评估为0.

编辑:Jens在评论中说,C99有_Bool类型.boolstdbool.h头文件中定义的宏.true并且false也是宏定义的stdbool.h.

C99的§7.16说,

bool扩展为_Bool.

[..] true扩展为整数常量1,false 扩展为整数常量0[...]

  • 无论C语言的版本和`bool` /`_Bool`类型的可用性如何,C中的关系运算符都产生`int`,而不是`bool`.即使在C99中,关系运算符仍然生成`int`. (8认同)
  • 确保自1999年以来在C中有`bool`.只需使用"stdbool.h"标题,这应该包括在内. (3认同)
  • @Jens:BTW,它是`_Bool`,而不是`bool`.对? (2认同)

AnT*_*AnT 47

你同时标记了你的问题[C]和[C++].结果将在语言之间保持一致,但答案的结构对于每种语言都是不同的.

在C语言中,您的示例与之无关bool(也适用于C99).在C语言中,关系运算符不会产生bool结果.两者4 > 54 < 5是产生类型的结果的表达式int用值01.因此,在C中的示例中没有任何类型的"bool to int conversion".

在C++中,关系运算符确实产生了bool结果.bool值可以转换为int类型,true转换为1false转换为0.这是由语言保证的.

PS C语言也有一个专用的布尔类型_Bool(宏别名为bool),其整数转换规则与C++中的基本相同.但是,这与您在C中的具体示例无关.再次,C中的关系运算符总是产生int(不bool)结果,而不管语言规范的版本如何.

  • 考虑到C和C++的+1. (4认同)
  • @ pic11:不,你不明白。在包括C99在内的C语言中,比较运算符的结果是“ int”,而不是“ bool”。**不进行任何转换。** (3认同)
  • 这是对的,K&R C中没有bool.我将我的问题重新标记为C99. (2认同)

小智 17

C标准的第6.5.8.6节说:

如果指定的关系为真,则每个运算符<(小于),>(大于),<=(小于或等于)和> =(大于或等于)将产生1,如果是,则为0 false.)结果的类型为int.