我正在使用生产代码,我已经在这样的语句中运行了几次:
Class.func(!!notABool);
前几次我将其视为programmer quirk
(可能是为了强调它是一个条件语句而不是传递给func的数字?)但是我遇到了几个使用上述语句的语句现在我想知道它是否确实有所作为。在大多数情况下notABool
是一个数字(int,float,double ......我已经看过所有3个)我最初的猜测是它类似于输入:
Class.func((bool)notABool);
但我不完全确定?
答案 0 :(得分:5)
是的,功能上它与执行(bool) notABool
完全相同。
根据定义,在C ++语言中,!
的操作数被隐式转换为bool
类型,因此!!notABool
实际上与!! (bool) notABool
相同,即与(bool) notABool
相同!!
。
在C语言中,(bool) notABool
是将非1/0值“标准化”为1/0形式的流行技巧。在C ++中,您可以!!notABool
。或者,如果您愿意,仍然可以使用{{1}}。
答案 1 :(得分:4)
对于原始类型,是的,它基本上等同于:
!(notABool != 0)
反过来相当于:
(bool)notABool
对于非原始类型,它将是一个编译器错误,除非你已经重载operator!
,在这种情况下,它可能会做任何事情。
答案 2 :(得分:2)
这是来自C的传统习语,意思是“规范化为0或1”。我不认为有理由在C ++中使用它而不是习惯。
答案 3 :(得分:1)
它将BOOL(为int定义)转换为c ++ bool。 BOOL是一个定义,在某些情况下,true可以包含不同的整数值。所以例如BOOL a =(BOOL)1;和BOOL b =(BOOL)2;两者都通过检查是否真实。但如果你试着比较你会发现一个不等于b。但转换后!!等于!! b。
(bool)notABoo - 不是类似的,因为你将转换变量字节的类型仍然会有不同的值。 !不仅可以转换类型,还可以转换为某些值。