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++编译器?:
Che*_*Alf 37
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转换为类型的prvalue bool; 得到的值是false."
2) C99和C11§6.3.1.2/ 1"当任何标量值被转换为时_Bool,如果值比较等于0则结果为0; 否则,结果是1."
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++中一样.