用C / C ++将int转换为bool
我知道在C和C ++中,当将bool转换为int时, (int)true == 1
和(int)false == 0
。 我想知道反向投射……
在下面的代码中,以下所有断言都适用于使用Visual Studio 2013和KeilμVision编译的.c文件5.注意(bool)2 == true
。
C和C ++标准对于将非零,非一个整数转换为bool的说法是什么? 是否指定了此行为? 请包括引用。
#include #include void TestBoolCast(void) { int i0 = 0, i1 = 1, i2 = 2; assert((bool)i0 == false); assert((bool)i1 == true); assert((bool)i2 == true); assert(!!i0 == false); assert(!!i1 == true); assert(!!i2 == true); }
不是重复我可以假设(bool)true ==(int)1对于任何C ++编译器? :
- 反向铸造(int – > bool)。
- 没有讨论非零,非一个值。
0基本类型的值(1)(2)映射为false
。
其他值映射为true
。
该公约通过其流程控制声明在原始C中建立; C当时没有布尔类型。
假设函数返回值为false
表示失败,这是一个常见的错误。 但特别是从main
它表示成功是false
。 我已经多次看错了,包括在D语言的Windows入门代码中(当你有像Walter Bright和Andrei Alexandrescu那样的人弄错了,那么它只是容易出错),因此这个单挑要小心。
没有必要为内置类型强制转换为bool
,因为转换是隐式的。 但是,Visual C ++(微软的C ++编译器)倾向于为此发出性能警告(!),这是一个纯粹的愚蠢警告。 强制转换不足以将其关闭,但通过双重否定转换,即return !!x
,效果很好。 一个人可以读!!
作为“转换为bool
”运算符,就像-->
可以读作“转到”。 对于那些深入了解运算符表示法的人。 😉
1) C ++14§4.12/ 1“零值,空指针值或空成员指针值转换为false
; 任何其他值都转换为true
。 对于直接初始化(8.5), std::nullptr_t
类型的prvalue可以转换为bool
类型的prvalue; 结果值是false
。“
2) C99和C11§6.3.1.2/ 1“当任何标量值转换为_Bool
,如果值比较等于0,则结果为0; 否则,结果是1.“
以下引用C11标准(最终草案)。
6.3.1.2:当任何标量值转换为_Bool时,如果值比较等于0,则结果为0; 否则,结果为1。
bool
(由stdbool.h
映射到内部名称_Bool
for C)本身是无符号整数类型 :
… _Bool类型和与标准有符号整数类型对应的无符号整数类型是标准无符号整数类型。
根据6.2.5p2 :
声明为_Bool类型的对象足以存储值0和1。
AFAIK这些定义在语义上与C ++完全相同 – 内置(!)名称的细微差别。 bool
for C ++和_Bool
for C.
请注意,C不像C ++那样使用术语rvalues 。 但是,在C指针中是标量 ,因此指定一个指向_Bool
的指针就像在C ++中一样。