C++!!转换为布尔 C++中有一个构造!!适用于非布尔值以将其转换为布尔值。例如: int n = 12; if ( !!n ) std::<<cout << "n is true"; else std::<<cout << "n is false"; int n=12; 如果(!!n) std::
唯一的限制是特定类型的对象应可转换为bool或integer类型 例如,无法转换下一种类型: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; } }; 只是运算符应用两次。它适用于中的所有表达式可以使用 编辑: 运算符的重载实例被实现为逻辑而不是限制是运算符(并且它必须产生一个类型,该类型还定义了运算符!)它适用于可以在布尔上下文中计算的任何类
struct A
{
int a;
float b;
};
但下一步可以:
struct B
{
int v;
operator int()
{
return v;
}
};
只是代码>运算符应用两次。它适用于中的所有表达式代码>可以使用
编辑:
运算符的重载实例假设代码>被实现为逻辑而不是限制是运算符必须为类型定义code>(并且它必须产生一个类型,该类型还定义了运算符!
)它适用于可以在布尔上下文中计算的任何类型。所以算术类型,指针类型(包括指向-(成员)(函数))的指针),以及任何转换为这些类型之一的东西。再加上一些零碎的东西,比如枚举类型,std::nullptr\u t
,还有一些我可能忘记的东西。C++11中的4/3定义了上下文转换为bool的含义,这就是内置的操作符代码>可以
对于所有这些类型,如果(!!n)
写if(!!n)
是多余的,您可以用相同的含义写if(n)
<代码>!!对于此类类型,n
表示与bool(n)
或static\u cast(n)相同代码>
它也适用于具有重载运算符的任何类型返回可转换为bool的类型(或返回带有运算符!
重载以返回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)
(ifn
是一个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
}