让我们说:
bool var = !!true;
它将为变量赋予“true”。似乎没用,但我看的是Visual Studio对“断言”的定义,它是:
#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )
为什么它两次否定“_Expression”?
我想知道他们想强迫“!”要调用的运算符(在它超载的情况下),但这似乎不是一个好理由。
答案 0 :(得分:7)
!!
保证结果最终为1或0,而不仅仅是_Expression
或0的值。在C中,它不太重要,但在C ++我认为它将表达式的结果转换为bool
类型,这在某些情况下可能很有用。如果你确实有一些需要传递文字1或0的API,那么使用!!
将是一种实现它的方法。
答案 1 :(得分:4)
可能您可能想要一个1
或0
的int变量。
因此,您无法传递5
,而双重否定会将5
转换为1
。
另外,看看如何定义TRUE
:
#ifndef TRUE
#define TRUE 1
#endif
因此,表达式如下:
int x = 5;
if ( x == TRUE )
{
//....
}
不会通过,而
if ( x )
{
//....
}
那样。
答案 2 :(得分:1)
它的用途是确保值为0或1.我认为它对于C ++的bool类型来说是多余的。