我有一些广泛使用!!
. 我有点困惑,因为据我所知!!
,它不是一个单独的操作员,而是两个!
接一个。所以这意味着这!!foo
与 just 相同foo
。
有什么地方和/或理由!!
真正有意义吗?我在想它是否可能有一点明智的意义?foo
所以你首先对结果执行一些位操作!
?但我似乎不记得!
被用作一个有点明智的操作员,似乎也没有找到任何参考告诉我它是。据我所知!
,仅用作逻辑运算符,在这种情况下
!!foo == foo
我有一些广泛使用!!
. 我有点困惑,因为据我所知!!
,它不是一个单独的操作员,而是两个!
接一个。所以这意味着这!!foo
与 just 相同foo
。
有什么地方和/或理由!!
真正有意义吗?我在想它是否可能有一点明智的意义?foo
所以你首先对结果执行一些位操作!
?但我似乎不记得!
被用作一个有点明智的操作员,似乎也没有找到任何参考告诉我它是。据我所知!
,仅用作逻辑运算符,在这种情况下
!!foo == foo
它不像双重否定那么简单。例如,如果您有x == 5
,然后应用两个 !运算符 ( !!x
),它将变为 1 - 因此,它用于标准化{0, 1}
范围内的布尔值。
请注意,您可以将零用作布尔值 false,将非零值用作布尔值 true,但您可能需要将结果标准化为 0 或 1,这!!
是有用的时候。
它与 相同x != 0 ? 1 : 0
。
另外,请注意,如果不在集合中,这将不是真的:foo
{0, 1}
!!foo == foo
#include <iostream>
using namespace std;
int main()
{
int foo = 5;
if(foo == !!foo)
{
cout << "foo == !!foo" << endl;
}
else
{
cout << "foo != !!foo" << endl;
}
return 0;
}
打印foo != !!foo
。
它可以用作foo
转换为布尔表达式的速记。出于某种原因,您可能只想将非布尔表达式转换为 true 或 false。
foo = !!foo
如果它不为零,它将变成,如果foo
它已经是,则将其保留。1
0
如果foo != 0
,那么!!foo == 1
。转换为 bool 基本上是一个技巧。
如果foo
不是 bool 类型,那么!!foo
将是。所以!!foo
可以是 1 或 0。
此技术用于在布尔上下文中对变量进行安全评估。如果您与 bool ( operator bool()
) 进行正常对话,则无关变量(具有不同类型)可能会以不需要的方式参与布尔表达式。operator!
实现了返回否定布尔值的定义。它的结果必须再次被否定。只需看看Safe bool idiom。