C++中的双重否定

45 浏览
0 Comments

C++中的双重否定

我刚刚参与了一个非常庞大的项目。

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

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

我知道这些家伙是聪明的程序员,很明显他们不是无意中这样做的。

我不是经验丰富的C ++专家, 我唯一的猜测是他们想要绝对确定正在评估的值是实际的布尔表示。因此,他们否定了它,然后再次否定,以将其恢复到其实际的布尔值。

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

admin 更改状态以发布 2023年5月19日
0
0 Comments

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

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

他们为什么要这样做? GCC的__builtin_expect将其参数视为长整型而不是布尔类型,因此需要某种形式的转换。由于在编写这些宏时不知道cond是什么,因此最通用的方法是简单地使用!! 习惯用语。

他们可能可以通过与0进行比较来做相同的事情,但我认为,双重否定实际上更直接,因为这是C中最接近bool转换的方式。

这段代码也可以在C ++中使用...这是一个最低公共分母的问题。 如果可能,请使用同时适用于C和C ++的方法。

0
0 Comments

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

0