C++中的双重否定
C++中的双重否定
我刚刚参与了一个非常庞大的项目。
我主要处理C ++,他们写的很多代码都使用双重否定来处理布尔逻辑。
if (!!variable && (!!api.lookup("some-string"))) { do_some_stuff(); }
我知道这些家伙是聪明的程序员,很明显他们不是无意中这样做的。
我不是经验丰富的C ++专家, 我唯一的猜测是他们想要绝对确定正在评估的值是实际的布尔表示。因此,他们否定了它,然后再次否定,以将其恢复到其实际的布尔值。
这是正确的吗,还是我错过了什么?
admin 更改状态以发布 2023年5月19日
在某些情况下,实际上这是一个非常有用的习惯用语。以这些宏为例(来自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 ++的方法。