C ++代码中的双重否定

我刚刚进入一个具有相当庞大代码库的项目。

我主要处理C ++,他们编写的许多代码都使用双重否定布尔逻辑。

 if (!!variable && (!!api.lookup("some-string"))) {
       do_some_stuff();
 }                                   

我知道这些家伙都是聪明的程序员,很明显他们不会偶然这样做。

我不是经验丰富的C ++专家,我唯一的猜测是他们为什么要这样做,他们想要绝对肯定被评估的值是实际的布尔表示。 所以他们否定它,然后再次否定它以使其回到其实际的布尔值。

这是正确的,还是我错过了什么?


这是一个转换为布尔的诀窍。


在某些情况下,它实际上是一个非常有用的习惯用语。 以这些宏为例(来自Linux内核的示例)。 对于GCC,它们的实现如下:

#define likely(cond)   (__builtin_expect(!!(cond), 1))
#define unlikely(cond) (__builtin_expect(!!(cond), 0))

为什么他们必须这样做? GCC的__builtin_expect将其参数视为long而不是bool ,因此需要进行某种形式的转换。 由于他们不知道当他们写这些宏时cond是什么,所以最简单的使用!! 成语。

他们也许可以通过与0进行比较来做同样的事情,但是在我看来,做双重否定实际上更直接,因为它最接近于C所具有的“投射到布尔”。

这个代码也可以在C ++中使用......这是一个最普通的分母。 如果可能的话,在C和C ++中执行哪些操作。


编码人员认为它会将操作数转换为布尔值,但由于&&的操作数已经隐含地转换为布尔值,所以它是完全多余的。

链接地址: http://www.djcxy.com/p/12769.html

上一篇: Double Negation in C++ code

下一篇: How to Move UITextField Cursor to Next Text Field