什么是“!!”的用法(否定两次)?

时间:2012-01-17 18:48:24

标签: c++ c

  

可能重复:
  Double Negation in C++ code

让我们说:

bool var = !!true;

它将为变量赋予“true”。似乎没用,但我看的是Visual Studio对“断言”的定义,它是:

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

为什么它两次否定“_Expression”?

我想知道他们想强迫“!”要调用的运算符(在它超载的情况下),但这似乎不是一个好理由。

3 个答案:

答案 0 :(得分:7)

!!保证结果最终为1或0,而不仅仅是_Expression或0的值。在C中,它不太重要,但在C ++我认为它将表达式的结果转换为bool类型,这在某些情况下可能很有用。如果你确实有一些需要传递文字1或0的API,那么使用!!将是一种实现它的方法。

答案 1 :(得分:4)

可能您可能想要一个10的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类型来说是多余的。