我知道在C和C ++中,当将bool转换为整数时,plot(Predict(fit2, fun=exp), anova=an, pval=TRUE, ylab="Hazard ratio")
和(int)true == 1
。我想知道反向投射......
在下面的代码中,在使用Visual Studio 2013和KeilμVision5编译的.c文件中,以下所有断言都适用于我。注意(int)false == 0
。
C和C ++标准对于将非零,非一个整数转换为bool的说法是什么?是否指定了此行为?请加入引文。
(bool)2 == true
不重复Can I assume (bool)true == (int)1 for any C++ compiler?:
答案 0 :(得分:32)
0基本类型的值(1)(2)映射到false
。
其他值映射到true
。
该惯例是通过其流量控制声明在原始C中建立的; C当时没有布尔类型。
假设作为函数返回值,false
表示失败,这是一个常见的错误。但特别是来自main
的{{1}}表示成功。我已经多次看到这个做错了,包括在D语言的Windows入门代码中(当你有像Walter Bright和Andrei Alexandrescu那样的人弄错了,那么它只是轻松容易出错),因此这个单挑提防要小心。
没有必要为内置类型强制转换为false
,因为转换是隐式的。但是,Visual C ++(微软的C ++编译器)倾向于为此发出性能警告(!),这是一个纯粹的愚蠢警告。强制转换不足以将其关闭,但通过双重否定转换即bool
,效果很好。可以将return !!x
读作“转换为!!
”运算符,就像bool
可以读作“转到”一样。对于那些深入了解运算符表示法的人。 ; - )
1) C ++14§4.12/ 1“零值,空指针值或空成员指针值转换为-->
;任何其他值都将转换为false
。对于直接初始化(8.5),类型true
的prvalue可以转换为std::nullptr_t
类型的prvalue;结果值为bool
。“
2) C99和C11§6.3.1.2/ 1“当任何标量值转换为false
时,如果值比较等于0,则结果为0;否则,结果是1.“
功能
答案 1 :(得分:11)
以下引用C11标准(最终草案)。
6.3.1.2:当任何标量值转换为_Bool时,如果值比较等于0,则结果为0;否则,结果是1。
bool
(由stdbool.h
映射到C的内部名称_Bool
本身就是unsigned integer type:
... _Bool类型和与标准有符号整数类型对应的无符号整数类型是标准的无符号整数类型。
根据6.2.5p2:
声明为_Bool类型的对象足以存储值0和1。
AFAIK这些定义在语义上与C ++完全相同 - 内置(!)名称的细微差别。 C ++为bool
,C为_Bool
。
请注意,C不像C ++那样使用术语rvalues。但是,在C指针中是 scalars ,因此指定一个指向_Bool
的指针就像在C ++中一样。
答案 2 :(得分:0)
删除警告的另一种方法(至少在MS Visual Studio 2019 C ++中)是使用三元运算符并将值直接设置为true或false:
int i = 3; // Or another value
bool b = (i ? true : false);
或者更明确地说:
int i = 3; // Or another value
bool b = (i > 0 ? true : false);
答案 3 :(得分:-1)
对于强制转换为int的某种老式的“ Marxismic”方式->不使用Microsoft cl编译器的C4800警告的布尔-使用否定性否定。
int i = 0;
bool bi = !!i;
int j = 1;
bool bj = !!j;