为了账号安全,请及时绑定邮箱和手机立即绑定

C+代码中的双重否定

C+代码中的双重否定

C++
温温酱 2019-07-15 15:50:44
C+代码中的双重否定我刚进入一个拥有相当庞大的代码库的项目。我主要是处理C+,他们编写的许多代码都使用双否定的布尔逻辑。 if (!!variable && (!!api.lookup("some-string"))) {        do_some_stuff();  }我知道这些人都是聪明的程序员,很明显他们这么做不是偶然的。我不是经验丰富的C+专家,我唯一的猜测是,他们这么做的原因是,他们想要绝对肯定被评估的值是实际的布尔表示。因此,他们否定它,然后再否定它,使它回到它的实际布尔值。这是对的,还是我遗漏了什么?
查看完整描述

3 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

转换成bool是个诡计。


查看完整回答
反对 回复 2019-07-15
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

在某些情况下,这实际上是一个非常有用的成语。以这些宏(例如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+中都有用的事情。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 440 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信