C++ 为什么要使用两个'';布尔值上的运算符?

C++ 为什么要使用两个'';布尔值上的运算符?,c++,boolean,C++,Boolean,可能重复: 当我扫描Webkit源代码时,我发现布尔“not”操作符的用法很奇怪: BOOL enabled; if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled))) continuousSpellCheckingEnabled = !!enabled; if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&am

可能重复:

当我扫描Webkit源代码时,我发现布尔“not”操作符的用法很奇怪

BOOL enabled;
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled)))
    continuousSpellCheckingEnabled = !!enabled;
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
    grammarCheckingEnabled = !!enabled;

为什么他们不直接使用
启用的
而不是
!!启用

这意味着强制将值设置为布尔值。因此,如果该值的计算结果为某个值,您将得到true。

最有可能的是continuousSpellCheckingEnabled是bool类型。BOOL定义为int,因此:

continuousSpellCheckingEnabled = enabled;
发出警告,同时:

continuousSpellCheckingEnabled = !!enabled;
没有

为什么他们不直接使用“启用”


双反运算仅对布尔值(0和1)进行抵消,因此
!!(0)==0
对于非布尔值,该值将转换为布尔值
!!(100)=1</Calp>

< P>这是一个C++技巧,将任何东西转换为<代码> 1 <代码>或<代码> 0 < /C> > < /P>
例如,
42
在逻辑上是
true
,但不是
1
,因此应用
将其转换为
1

它强制将真值精确为1

在布尔上下文中(
if(x)
while(x)
x?a:b
for(;x;)
),值
0
表示假,而任何其他值表示真

如果您的函数接受一个真值,但您需要正好1,
很好


换句话说,
!!x与
x相同吗?1:0

这里没有明确提到它,但是
BOOL
很可能是某种整数。根据
successed
,我假设winapi,其中的
int
+1解释了为什么可能需要转换为{0,1}