在非布尔变量上使用的double not(!!)是什么?

Sam*_*rsa 5 c++ boolean

可能重复:
C++代码中的双重否定.

我正在使用生产代码,我已经在这样的语句中运行了几次:

Class.func(!!notABool);
Run Code Online (Sandbox Code Playgroud)

前几次我把它视为一个programmer quirk(也许是为了强调它是一个条件语句,而不是一个数字传递给func?)但是我遇到了几个使用上面的语句,现在我想知道它是否真的使差异与否.在大多数情况下notABool是一个数字(int,float,double ......我已经看过所有3)我最初的猜测是它类似于输入:

Class.func((bool)notABool);
Run Code Online (Sandbox Code Playgroud)

但我不完全确定?

Oli*_*rth 5

对于原始类型,是的,它本质上相当于:

!(notABool != 0)
Run Code Online (Sandbox Code Playgroud)

这又相当于:

(bool)notABool
Run Code Online (Sandbox Code Playgroud)

对于非基本类型,这将是一个编译器错误,除非您重载了operator!,在这种情况下,它可能会执行任何操作。


AnT*_*AnT 5

是的,从功能上讲,它与do完全相同(bool) notABool

根据定义,在C ++语言中,的操作数!隐式转换为booltype,因此!!notABool实际上与相同!! (bool) notABool,即与just相同(bool) notABool

在C语言中,这!!是一种流行的技巧,可以将非1/0值“标准化”为1/0形式。在C ++中,您可以这样做(bool) notABool。或者,!!notABool如果您愿意,仍可以使用。