我有一些C ++代码可以广泛使用!!
。我有点困惑,因为据我所知,!!
不是自己的运算符,而是两个!
之后的运算符。这意味着!!foo
与foo
相同。
当!!
真正有意义时,是否有任何地方或理由?我在考虑它是否可能有一些明智的含义?那么你首先对foo
然后!
执行一些有点明智的操作?但我似乎不记得!
被用作一个明智的运算符,似乎没有找到任何参考告诉我它也是。据我所知!
仅用作逻辑运算符,在那种情况下
!!foo == foo
答案 0 :(得分:49)
它不像双重否定那么简单。例如,如果您有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
。
答案 1 :(得分:8)
它可以用作将foo
转换为布尔表达式的简写。您可能希望出于某种原因将非布尔表达式专门设置为true或false。
foo = !!foo
如果它不为零,则会将foo
变为1
,如果已经存在,则将其保留在0
。
答案 2 :(得分:4)
如果foo != 0
,则!!foo == 1
。这基本上是一个转换为bool的技巧。
答案 3 :(得分:3)
如果foo
不是bool类型,则!!foo
将是。{1}}。所以!!foo
可以是1或0。
答案 4 :(得分:1)
此技术用于安全评估布尔上下文中的变量。如果您与bool(operator bool()
)进行正常对话,则不相关的变量(具有不同类型)可以以不需要的方式参与布尔表达式。实现了operator!
的定义,其返回否定的布尔值。其结果必须再次否定。只需看看Safe bool idiom即可。