这个问题已经在这里有一个答案:
- c + +中的代码双重否定 14回答
- 什么是“!!”用C? [重复] 7个答案
我有一些C ++代码,使广泛使用的!!
。 我有点困惑,因为据我所知!!
是不是它自己的,但两个运营商!
之后对方。 因此,这将意味着!!foo
是一样的只是foo
。
是否有任何地方,或原因,当!!
实际上是有意义的? 我在想,如果它或许可以有一点聪明的含义是什么? 所以,你先执行一些逐位操作foo
然后!
这一结果? 但我似乎不记得!
被用作逐位操作,似乎没有找到任何引用告诉我,它要么是。 至于我可以告诉大家!
在仅作为一个逻辑运算符和在这种情况下
!!foo == foo
它不像双重否定一样简单。 举例来说,如果你有x == 5
,然后应用两种! 运算符( !!x
),这将成为1 -因此,它被用于在标准化布尔值{0, 1}
的范围。
请注意,您可以使用零为布尔值false,并为逻辑真不为零,但你可能需要将结果归为0或1,那就是当!!
是非常有用的。
这是一样的x != 0 ? 1 : 0
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
。 它基本上是要转换为布尔一招。
如果foo
是bool类型的不是,那么!!foo
会。 所以!!foo
可以是1或0。
该技术是在布尔上下文中的一个变量的安全评估。 如果你有一个正常的对话为bool( operator bool()
不相关的变量(用不同的充型)可以以意外方式参与布尔表达式。 的确定指标operator!
它返回一个否定的布尔值被实现。 而其结果必须被再次被否定。 只要看看在安全布尔成语 。