C中的双重否定

新手上路,请多包涵

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

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

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

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

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

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

原文由 Brian Gianforcaro 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 591
2 个回答

转换为布尔值是一个技巧。

原文由 Don Neufeld 发布,翻译遵循 CC BY-SA 2.5 许可协议

这可能是 双爆技巧 的一个例子(有关更多详细信息,请参阅 The Safe Bool Idiom )。这里我总结一下文章的第一页。

在 C++ 中,有多种方法可以为类提供布尔测试。

一个明显的方法是 operator bool 转换运算符。

 // operator bool version
class Testable {
    bool ok_;
    public:
    explicit Testable(bool b = true) : ok_(b) {}

    operator bool() const { // use bool conversion operator
      return ok_;
    }
};

我们可以这样测试这个类:

 Testable test;
if (test) {
    std::cout << "Yes, test is working!\n";
}
else {
    std::cout << "No, test is not working!\n";
}

但是, operator bool 被认为是不安全的,因为它允许无意义的操作,例如 test << 1;int i = test

使用 operator! 更安全,因为我们避免了隐式转换或重载问题。

实现很简单,

 bool operator!() const { // use operator!
    return !ok_;
}

测试 Testable 对象的两种惯用方法是

Testable test;
if (!!test) {
    std::cout << "Yes, test is working!\n";
}
if (!test) {
    std::cout << "No, test is not working!\n";
}

第一个版本 if (!!test) 就是有些人所说的 双爆技巧

原文由 kgf3JfUtW 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题