2015-07-22 134 views
16

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

在下面的代码中,以下所有断言对于使用Visual Studio 2013和KeilμVision5编译的.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); 
} 

Can I assume (bool)true == (int)1 for any C++ compiler?重复:

  1. 在反向方向上铸造(INT - >布尔)。
  2. 没有讨论那里非零,非一个值。基本类型的
+4

所有非零整数都应该转换为true。我没有规格,所以我没有发布答案。 C/C++中的 – yizzlez

+0

任何!0为真,0为假。所以,2确实如此。 (2!= 0)== true。 – ydobonebi

+2

@SergeyK。你真的读过这个问题吗? – emlai

回答

23

0值(1)(2)地图false

其他值映射到true

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


这是一个常见的错误,假设作为函数返回值,false表示失败。但特别是从main这是false,表明成功。我已经看到这种做法很多次了,包括在D语言的Windows启动器代码中(当你有像Walter Bright和Andrei Alexandrescu这样的人搞错了,那么这只是容易得到错误),因此,这头注意小心。


由于该转换是隐含的,因此不需要为内置类型转换为bool。但是,Visual C++(Microsoft的C++编译器)倾向于为此发出性能警告(!),这是一种纯粹的愚蠢警告。演员阵容不足以关闭它,但通过双重否定转换,即return !!x,效果很好。可以将!!读作“转换为bool ”运算符,就像-->可以读为“转到”一样。对于那些深入阅读操作符号的人来说。 ;-)


1) C++ 14§4.12/ 1 “零值,空指针值,或空构件指针值被转换为false;任何其他值转换为true。对于直接初始化(8.5),类型std::nullptr_t的预值可以转换为bool类型的预值;结果的值是false。 ”
2) C99和C11§6.3.1。2/1 “当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则结果为1. ”

+5

我不认为'main'成功返回“false”。'main'返回'int',而不是bool,并且对于成功/失败使用不同的约定。 (Unix系统调用仍使用第三个映射。) –

+0

您能否引用确认第一部分的标准部分? –

+0

@ cp.engr:我猜你没有该标准或草案的副本。得到一个是个好主意,例如N3936(最新草案)适用于C++ 14。当你检查出来的时候,你会发现§4.12指出“零值,空指针值或空成员指针值被转换为false; 任何其他值被转换为true。对于直接初始化(8.5)一个std :: nullptr_t类型的prvalue可以被 转换为一个类型为bool的prvalue;结果值为false。“我希望这不是作业?培训在文件中找到自己的方式非常重要,包括Holy Standard™。 –

7

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

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

bool(由stdbool.h映射到内部名_Bool为C)本身是一个unsigned integer type

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

根据6.2.5p2

一个目的声明为类型_Bool是大到足以存储值0和1。

AFAIK这些定义在语义上等同于C++ - 与内置(!)名称的细微差别。 C为bool,C为_Bool

请注意,C不像C++那样使用术语rvalues。但是,在C指针中是标量,因此将指针指向_Bool的行为与C++中的行为相同。

+2

从C++ 03开始:“算术,枚举,指针或指向成员类型的指针可以转换为bool类型的右值,零值,空指针值或空成员指针值是转换为假;任何其他值转换为真“。我相信这个问题是一个骗局。 –

+0

@MichaelBurr:我同意关于C++的欺骗,但它可能不适用于C.我仍然在C标准中寻找一个相关的段落。 – Olaf

+2

Re“AFAIK这些定义在C和C++之间是相同的”,没有不完全。在C++中,'bool'是一个内置的类型,而不是宏,并且没有什么像'_Bool'。 –