当我扫描Webkit源代码时,我发现了一个奇怪的使用布尔“not”运算符!
:
BOOL enabled;
if (SUCCEEDED(sharedPreferences->continuousSpellCheckingEnabled(&enabled)))
continuousSpellCheckingEnabled = !!enabled;
if (SUCCEEDED(sharedPreferences->grammarCheckingEnabled(&enabled)))
grammarCheckingEnabled = !!enabled;
为什么他们不直接使用enabled
而不是!!enabled
?
答案 0 :(得分:14)
将任何内容转换为1
或0
是一种C ++技巧。
例如,42
逻辑上为true
,但不是1
,因此对其应用!!
,您将其转换为1
。
答案 1 :(得分:5)
这意味着将值强制为布尔值。因此,如果值正在评估某些东西,那么你就会变成现实。
答案 2 :(得分:4)
强制真值恰好为1。
在布尔上下文(if (x)
,while (x)
,x ? a : b
,for (; x; )
)中,0
的值表示false,而任何其他值表示真。
如果你的函数接受了一个真值,但你在那里只需要1,那么!!
就可以了。
换句话说,!!x
与x ? 1 : 0
相同。
答案 3 :(得分:1)
最常见的连续拼写检查已启用类型为bool。 BOOL定义为int,所以:
continuousSpellCheckingEnabled = enabled;
发出警告,同时:
continuousSpellCheckingEnabled = !!enabled;
没有。
答案 4 :(得分:1)
为什么他们不直接使用“启用”
双重否定仅取消布尔值(0和1),因此对于非布尔值!!(0) == 0
,该值将转换为布尔值!!(100) == 1