返回布尔值时,为什么要使用"!!
When returning a boolean, why use "!!"
我看到了一些C++这样的代码:
bool MyProject::boo(...)
{
bool fBar = FALSE;
....
return !!fBar;
}
我想不出在这种情况下直接返回fBar
和返回!!fBar
之间有什么区别。两个负面因素如何发挥作用?
谢谢
在您的
示例中,返回fBar
和返回!!fBar
之间没有区别。
在其他情况下,例如当使用用户定义的类型如BOOL
(typedef
-ed to be int
)时,!!
构造具有强制任何非零值true
的效果;即 !!fBar
相当于fBar ? true : false
。如果fBar
可以是 5,并且您想将其与定义为 (BOOL)1
的 TRUE
进行比较,这可能会有所不同。
这样做通常是为了避免在必须将非布尔值转换为bool
类型的情况下出现编译器警告。某些编译器(如 MSVC++)在将非布尔值隐式转换为 bool
时发出"性能"警告。禁止显示此警告的一种方法是使用显式转换。另一种方法是使用!!
组合。
但是,在您的情况下,return
的论点已经声明为bool
,这意味着上述推理不适用。(你确定它是bool
而不是,比如说,BOOL
?在这种情况下,该!!
没有有意义的解释。
!!
"is"到布尔"运算符(不是真的,它是两个否定运算符)。这种情况没有什么不同。但是,如果不bool
,则会有所不同。
例如
int fBar = 2; // !!fBat evaluate to 1
bool b = (fBar == true) // this is false
b = fBar; // this is true
b = !!fBar; // this is also true
typedef int MyBool; // say some library use int as boolean type
#define MY_TRUE 1
#define MY_FALSE 0
MyBool b2 = fBar; // this evaluate to true, but not equal to true
if (b2 == MY_TRUE )
{
// this code will not run, unexpected
}
if (b2)
{
// this code will run
}
MyBool b3 = !!fBar;
if (b2 == MY_TRUE )
{
// this code will run
}
if (b2)
{
// this code will run
}
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 为什么布尔值不能比作最后一点?
- 为什么这个程序不输出布尔值?
- 为什么 SFINAE 没有给出增加布尔值的正确结果?
- 为什么我的变体将 std::string 转换为布尔值
- 为什么使用 int 的转换,而不是布尔值
- 为什么 lambda 会转换为值为真的布尔值?
- 为什么在布尔值上使用两个"!"运算符?
- 为什么提升circular_buffer存储我的布尔值?
- 为什么 std::atomic<bool> 比挥发性布尔值慢得多?
- 重载运算符<<输出布尔值.为什么
- 赋值操作在C中隐式计算为什么布尔值
- 为什么C++设置迭代器不能转换为布尔值?
- 为什么 isnan、isinf 和 isfinite 返回 int 而不是布尔值
- 为什么 std::string 没有隐式转换为布尔值
- 为什么总是得到相同的布尔值
- 返回布尔值时,为什么要使用"!!
- 为什么这个布尔值在 C++ 而不是 Java 中编译
- 为什么我应该使用 1 位位字段而不是布尔值
- 为什么我的全局布尔值总是导致false