C+代码中的双重否定

C+代码中的双重否定

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

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

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

我知道这些人都是聪明的程序员,很明显他们这么做不是偶然的。

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

这是对的,还是我遗漏了什么?


温温酱
浏览 441回答 3
3回答

吃鸡游戏

转换成bool是个诡计。

翻翻过去那场雪

在某些情况下,这实际上是一个非常有用的成语。以这些宏(例如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+中都有用的事情。
打开App,查看更多内容
随时随地看视频慕课网APP