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

Casting int to bool in C/C++

本文关键字:转换 bool int C++ 中将      更新时间:2023-10-16

我知道在C和C++中,当将布尔强制转换为int、(int)true == 1(int)false == 0时。我想知道朝相反的方向选角。。。

在下面的代码中,在使用Visual Studio 2013和KeilµVision 5编译的.c文件中,以下所有断言对我来说都是正确的。注意(bool)2 == true

C和C++标准对将非零、非一整数强制转换为布尔值有何规定?是否指定了此行为?请附上引文。

#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);
}

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

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

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

其他值映射到true

该约定是在原始C中通过其流量控制语句建立的;C当时没有布尔类型。


假设false作为函数返回值表示失败是一个常见的错误。但特别是从main来看,false表示成功。我已经多次看到这种错误,包括在D语言的Windows入门代码中(当你有像Walter Bright和Andrei Alexandrescu这样的人出错时,很容易出错(,因此请注意。


对于内置类型,不需要强制转换为bool,因为这种转换是隐式的。然而,Visual C++(微软的C++编译器(有一种倾向,会为此发出性能警告(!(,这是一个纯粹愚蠢的警告。强制转换不足以关闭它,但通过双重否定的转换,即return !!x,效果很好。可以将CCD_ 11读取为“转换为bool”运算符,与-->一样可以读作“转到";。对于那些深入研究运算符符号可读性的人。;-(


1(C++14§4.12/1“零值、空指针值或空成员指针值被转换为false;任何其它值被转换为CCD_ 15。对于直接初始化(8.5(,std::nullptr_t类型的prvalue可以转换为bool类型的prvalue;得到的值是CCD_ 18”
2(C99和C11§6.3.1.2/1“当任何标量值转换为_Bool时,如果该值比较等于0,则结果为0;否则,结果为1。";

以下引用了C11标准(最终草案(。

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

bool(由stdbool.h映射到C的内部名称_Bool(本身是一个无符号整数类型:

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

根据6.2.5p2:

声明为类型_Bool的对象足够大,可以存储值0和1。

AFAIK这些定义在语义上与C++相同,只是内置的(!(名称略有不同。C++的bool和C.的_Bool

注意,C不像C++那样使用术语右值。然而,在C中,指针是标量,因此将指针分配给_Bool的行为与C++中一样。

在没有微软cl编译器C4800警告的情况下,对cast-int->bool有一种老派的"Marxismic"方法,那就是使用否定的否定。

int  i  = 0;
bool bi = !!i;
int  j  = 1;
bool bj = !!j;