双重非运算符(!!)在非布尔变量上使用的作用是什么?

7
我正在处理一些生产代码,其中多次遇到以下语句:

可能是重复问题:
C++代码中的双重否定。

我正在处理一些生产代码,其中多次遇到以下语句:

Class.func(!!notABool);

前几次我将它解释为一个程序员的怪癖(也许是为了强调这是一个条件语句而不是传递给函数的数字?),但我遇到了几个使用上述代码的语句,现在我想知道它是否真的有所区别。在大多数情况下,notABool 是一个数字(int、float、double……我见过这三种)。我的初步猜测是它类似于输入:

Class.func((bool)notABool);

but I am not entirely sure?


等待Donald Knuth的引用,倒计时5...4...3... - Skizz
@jonsca:天啊!搜索了除否定之外的所有措辞。同意,那是一个重复的问题。 - Samaursa
不用担心。我认为重复的标题有点误导,但它出现在“相关”列表中。 - jonsca
那看起来像是一个非常糟糕的做法。 - Steve Wellens
4个回答

7

功能上来说,使用 (bool) notABool 和使用 !!notABool 是完全相同的。

在 C++ 语言中,! 的操作数会被隐式转换为 bool 类型,因此 !!notABool 实际上是等同于 !! (bool) notABool,也就是与使用 (bool) notABool 等价。

在 C 语言中,!! 是一种常见技巧,可以将非 1/0 值规范化为 1/0 表示。在 C++ 中,你可以直接使用 (bool) notABool 来实现这个目的。当然,如果你愿意,仍然可以使用 !!notABool


5
对于基本类型,是的,它基本上相当于:
!(notABool != 0)

这反过来等同于:

(bool)notABool

对于非原始类型,除非您重载了operator!,否则会导致编译错误,如果重载了它,则可能会发生任何事情。

3

这是C语言中的传统习惯用法,意思是“标准化为0或1”。我认为在C++中除了习惯外没有其他使用它的理由。


1

这是将BOOL(定义为int)转换为C++ bool。BOOL是一个定义,在某些情况下,对于true可以包含不同的整数值。例如,BOOL a =(BOOL)1;和BOOL b =(BOOL)2;都通过了true检查。但是,如果您尝试比较,您会发现a不等于b。但是在转换后,!!a等于!!b。

(bool)notABoo - 不同,因为您将转换变量字节的类型仍然具有不同的值。 !!不仅转换类型,而且在某些情况下还转换值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接