当前位置:  开发笔记 > 编程语言 > 正文

为何使用!! 将int转换为bool时?

如何解决《为何使用!!将int转换为bool时?》经验,为你挑选了6个好方法。

以这种方式将整数转换为布尔值的原因是什么?

bool booleanValue = !!integerValue;

而不仅仅是

bool booleanValue = integerValue;

我所知道的是,在VC++ 7中,后者将导致C4800警告而前者不会.这两者之间还有其他区别吗?



1> user143506..:

"!!"的问题 成语是它简洁,难以看清,容易误认为是错字,容易丢掉其中一个"!",等等.我把它放在"看起来我们可以用C/C++变得多么可爱"的类别中.

写一下bool isNonZero = (integerValue != 0);......要清楚.


+1"看起来我们可以用C/C++变得多么可爱".完美地总结了C/C++语法和松散规则所带来的错误编码实践.
+1为"bool isNonZero =(integerValue!= 0);".当代码用bool's混合int,double,ptrs等时,我总是讨厌它.它们是不同的类型,应该这样对待.bool对数字类型的隐式转换是一种同步.
我没有看到将int /指针视为bool的问题 - 这是一个库存C/C++习语,任何精通它们的开发人员都应该知道它.但是,有时候你想要避免编译器警告等等 - 在这种情况下,expicit比较(或演员)肯定比相对模糊的`!!'技巧更可取.
-1表示"bool isNonZero =(integerValue!= 0);",这既不可读也不"直观".如果您不喜欢像!!这样的标准C/C++习语,请使用其他语言.
0等于false,因为标准这样说;-) !! 你似乎并不熟悉这是一个很常见的习语.除了在自然语言句子的开头使用之外,这并不会使它变得非常糟糕.

2> T.J. Crowder..:

从历史上看,!!习惯用于确保你的bool确实包含了一个类似bool变量中预期的两个值中的一个,因为C和C++没有真正的bool类型,我们用ints 伪造它.对于"真实"而言,这不是一个问题bool.

但是使用!!是一种有效的文档记录方式(对于编译器和任何未来的代码工作人员而言)是的,你确实打算将其int转换为bool.


如果OP甚至不理解它的意思,我不会说"一种有效的记录方式".一个更好的方法是static_cast (integerValue).
OP可能首先不知道`List `的意思,或者`|| =`.`!!`在C和C++世界中是一个非常非常根深蒂固的习语.如果有人不知道,他/她应该学习它 - 然后对是否使用它进行自己的合理评估.
什么是错误的`bool var =(bool)intVar;`?

3> SasQ..:

使用它是因为C语言(以及一些预先标准的C++编译器)没有bool类型,只是int.所以ints被用来表示逻辑值:0应该是意思false,其他一切都是true.该!运营商正在恢复100从其他一切.Double !用于反转那些,它确保值只是01取决于其逻辑值.

在C++中,由于引入了正确的bool类型,因此不再需要这样做了.但是,由于C与C++的向后兼容性(大多数情况下),您不能只更新所有遗留源,而且您不应该这样做.但是很多人仍然这样做,原因相同:保持他们的代码向后兼容旧的编译器仍然不理解bools.

这是唯一真正的答案.其他答案具有误导性.



4> StampedeXV..:

因为!integerValue表示integerValue == 0和!! integerValue因此表示integerValue!= 0,一个返回bool的有效表达式.后者是信息丢失的演员.



5> 小智..:

另一个选项是三元运算符,它似乎生成一行较少的汇编代码(无论如何在Visual Studio 2005中):

bool ternary_test = ( int_val == 0 ) ? false : true;

它产生汇编代码:

cmp DWORD PTR _int_val$[ebp], 0
setne   al
mov BYTE PTR _ternary_test$[ebp], al

与:

bool not_equal_test = ( int_val != 0 );

产生:

xor eax, eax
cmp DWORD PTR _int_val$[ebp], 0
setne   al
mov BYTE PTR _not_equal_test$[ebp], al

我知道这不是一个巨大的差异,但我很好奇它,只是认为我会分享我的发现.



6> John Scipion..:

bool只能有两个状态,0和1.假设有符号的32位整数,整数可以具有从-2147483648到2147483647的任何状态.一元!如果输入为0,则运算符输出1,如果输入为0以外的任何值,则输出0.所以!0 = 1和!234 = 0.第二个!只需切换输出,使0变为1,1变为0.

所以第一个语句保证booleanValue将被设置为等于0或1而没有其他值,第二个语句不会.


这是完全错误的.第二个语句涉及一个隐含的`int`->`bool`强制转换.这是明确定义的,任何非零的`int`都将转换为`true`,0将转换为`false`.VC++给出的警告实际上是一个"性能警告",与此无关.
C++中bool的状态不是1和0,而是真和假.
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有