可能重复:
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)
但我不完全确定?
对于原始类型,是的,它本质上相当于:
!(notABool != 0)
Run Code Online (Sandbox Code Playgroud)
这又相当于:
(bool)notABool
Run Code Online (Sandbox Code Playgroud)
对于非基本类型,这将是一个编译器错误,除非您重载了operator!
,在这种情况下,它可能会执行任何操作。
是的,从功能上讲,它与do完全相同(bool) notABool
。
根据定义,在C ++语言中,的操作数!
隐式转换为bool
type,因此!!notABool
实际上与相同!! (bool) notABool
,即与just相同(bool) notABool
。
在C语言中,这!!
是一种流行的技巧,可以将非1/0值“标准化”为1/0形式。在C ++中,您可以这样做(bool) notABool
。或者,!!notABool
如果您愿意,仍可以使用。