C++!!转换为布尔 C++中有一个构造!!适用于非布尔值以将其转换为布尔值。例如: int n = 12; if ( !!n ) std::<<cout << "n is true"; else std::<<cout << "n is false"; int n=12; 如果(!!n) std::

C++!!转换为布尔 C++中有一个构造!!适用于非布尔值以将其转换为布尔值。例如: int n = 12; if ( !!n ) std::<<cout << "n is true"; else std::<<cout << "n is false"; int n=12; 如果(!!n) std::,c++,if-statement,conditional-statements,C++,If Statement,Conditional Statements,唯一的限制是特定类型的对象应可转换为bool或integer类型 例如,无法转换下一种类型: struct A { int a; float b; }; 但下一步可以: struct B { int v; operator int() { return v; } }; 只是运算符应用两次。它适用于中的所有表达式可以使用 编辑: 运算符的重载实例被实现为逻辑而不是限制是运算符(并且它必须产生一个类型,该类型还定义了运算符!)它适用于可以在布尔上下文中计算的任何类

唯一的限制是特定类型的对象应可转换为bool或integer类型

例如,无法转换下一种类型:

struct A
{
  int a;
  float b;
};
但下一步可以:

struct B
{
  int v;
  operator int()
  {
    return v;
  }
};

只是
运算符应用两次。它适用于
中的所有表达式可以使用

编辑:


运算符
的重载实例被实现为逻辑
而不是

限制是
运算符(并且它必须产生一个类型,该类型还定义了
运算符!

它适用于可以在布尔上下文中计算的任何类型。所以算术类型,指针类型(包括指向-(成员)(函数))的指针),以及任何转换为这些类型之一的东西。再加上一些零碎的东西,比如枚举类型,
std::nullptr\u t
,还有一些我可能忘记的东西。C++11中的4/3定义了上下文转换为bool的含义,这就是内置的
操作符可以

对于所有这些类型,如果(!!n)
if(!!n)
是多余的,您可以用相同的含义写
if(n)
<代码>!!对于此类类型,n
表示与
bool(n)
static\u cast(n)相同

它也适用于具有重载
运算符的任何类型运算符!
重载以返回
bool
的类型)的代码>


如果是最左边的
运算符
返回bool以外的类型,那么如果(!!n)
,您可能仍然能够编写
,但是
不作为到
bool
的转换。它可以转换为返回的任何类型。

其他答案适合您的实际问题

但是,如果您打算使用示例中的代码来“简化”代码(因为它使代码更短),我想我建议您不要这样做。相反,简化含义并检查整数是否为零,而不是整数上的双负数

if (n!=0) 
    { 
      //whatever
    }

明确地测试零对独立于您是否记得C++中使用的“零是假”约定有好处。请参阅,以及下面的评论

这是因为对我来说,
如果(!!my_int)
不是很清楚-不清楚会发生什么,在这一点上形成分支似乎会导致问题

前面的片段(以便非常有用的注释有意义)


请使用编辑器中的
{}
按钮格式化code.related?()可以,但定义运算符
这不是逻辑
的等价物,而不是
不是好的编程实践@克拉斯林德贝克:你听说过和/或性病流吗?另外,Boost原型和派生作品(表现力、精神)使用操作符!非常成功地返回了甚至不能转换为boolSo的内容,让我们尝试指定类型:1)POD(int、long等);2) 指针?;3) 任何支持运算符的自定义类@丹尼斯:以下类型是POD,但不适用于
结构a{intB;}。以下类型是POD,并且可以工作:
bool
。所以POD在这里不是一个有用的分类。我更喜欢你的风格,让代码尽量明显。然而,有很多地方!!仍然使用。对于整数类型,这太荒谬了,只需编写
if(my_int)
。只要你愿意,你可以继续添加噪音:
boolmy\u bool=!!((n!=0)?对:错)?对:!!假),但这只是噪音。C++程序员必须知道,C++中,整数可以用于布尔上下文,这意味着什么,然后<代码>(MyIint)< /C>完全可读,或者<代码>(MyOnint!=0)< /C> >如果您确实不喜欢int -BooL转换。代码>应保留给未转换为
bool
但具有
运算符的类型,尽管有些人使用它来避免键入
(bool)
,或者在从C89迁移的代码中。@SteveJessop:说得好。我想删除我的答案,但我认为你的评论是有用的-因此staying@Tom
(n!=0)?true:false
是一种反模式。只是
n!=0
?@SteveJessop如果(n)
也令人困惑,如果
n
不是布尔值,那么只写
。说出你的意思,说出你的意思:
if(n!=0)
(if
n
是一个
int
)。正因为C++支持了大量的隐式转换,并不意味着你必须使用它们。我实际上会调用<代码>!!<代码>反模式。如果一个对象转换为
bool
或类似的东西(应该很少),那么直接将其用作
bool
。如果不支持,则不应支持
任意一个。大多数时候,最好明确说明您正在测试什么:
someInt==0
(而不是
!!someInt
),或者
!someObj.isValid()
,而不是
!!someObj
,甚至
someObj
。我认为最后一段是错的。如果
!n
不是
bool
(因为公然滥用运算符重载),然后
!!n
将调用
在任何类型上
!n
返回。对于所有非用户定义的类型,如果
是合法的,结果是
bool
@James:“如果它不支持,它也不应该支持!或者”-我想我同意,我只是不确定自己是否可以作为一个规则来陈述它。我怀疑
最常用作C89(或更早版本)代码的后遗症,当然这里没有
bool my_bool = (n != 0) ? true : false; //whichever way you want it to work.
if (my_bool) 
  { 
    //whatever
  }