在C/C++中将int转换为bool

cp.*_*ngr 27 c c++ casting boolean

我知道在C和C++中,当将bool转换为int时,(int)true == 1(int)false == 0.我想知道反向投射......

在下面的代码中,在使用Visual Studio 2013和KeilμVision5编译的.c文件中,以下所有断言都适用于我(bool)2 == true.

C和C++标准对于将非零,非一个整数转换为bool的说法是什么?是否指定了此行为?请加入引文.

#include <stdbool.h>
#include <assert.h>

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);
}
Run Code Online (Sandbox Code Playgroud)

不是重复我可以假设(bool)true ==(int)1对于任何C++编译器?:

  1. 反向铸造(int - > bool).
  2. 没有讨论非零,非一个值.

Che*_*Alf 37

0基本类型的值(1)(2)映射到false.

其他值映射到true.

该公约通过其流程控制声明在原始C中建立; C当时没有布尔类型.


假设函数返回值false表示失败,这是一个常见的错误.但特别是mainfalse表明成功.我已经多次看到这个做错了,包括在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转换为类型的prvalue bool; 得到的值是false."
2) C99和C11§6.3.1.2/ 1"当任何标量值被转换为时_Bool,如果值比较等于0则结果为0; 否则,结果是1."

  • 我不认为"主要"是为了成功而返回"假".`main`返回`int`,而不是bool,并且有不同的成功/失败约定.(Unix系统调用使用第三个映射.) (8认同)
  • @ cp.engr:我想您没有标准或草案的副本。最好购买一个,例如C ++ 14的N3936(最新草案)。在其中进行检查时,发现§4.12指出“零值,空指针值或空成员指针值将转换为false;其他任何值都将转换为true。对于直接初始化(8.5),可以将std :: nullptr_t类型的prvalue转换为bool类型的prvalue;结果值为false。” 我希望这不是功课吗?培训如何找到文档的方法非常重要,包括Holy Standard™。 (2认同)
  • @cp.engr:哦。我没有最新的 C 标准,抱歉。在 C99 中,它在 §6.3.1.2/1 中指定“当任何标量值转换为 _Bool 时,如果该值等于 0,则结​​果为 0;否则,结果为 1” (2认同)

too*_*ite 13

以下引用C11标准(最终草案).

6.3.1.2:当任何标量值转换为_Bool时,如果值比较等于0,则结果为0; 否则,结果为1.

bool(映射stdbool.h_BoolC 的内部名称)本身是无符号整数类型:

...类型_Bool和与标准有符号整数类型对应的无符号整数类型是标准无符号整数类型.

根据 6.2.5p2:

声明为_Bool类型的对象足以存储值0和1.

AFAIK这些定义在语义上与C++完全相同 - 内置(!)名称的细微差别.bool用于C++和_Bool为C.

请注意,C不像C++那样使用术语rvalues.但是,在C指针中是标量,因此指定一个指向_Bool行为的指针就像在C++中一样.

  • 从C++ 03:"算术,枚举,指针或指向成员类型的指针的右值可以转换为bool类型的右值.零值,空指针值或空成员指针值转换为false;任何其他值都转换为true".我敢肯定,这个问题是一个骗局. (2认同)
  • Re"AFAIK这些定义在C和C++之间是相同的",并非完全不同.在C++中,`bool`是一个内置类型,而不是一个宏,并且没有什么像`_Bool`. (2认同)