2016-12-05 95 views
1

我很想知道在C++中这两个块是否有区别。 这将是非常有用的,如果与答案,你可以引用一些参考。if(intVar)和if(intVar!= 0)之间有区别吗?

if (intVar!= 0) 
{ 
    //Do something 
} 

if (intVar) 
{ 
    //Do samething 
} 

intVar在哪里,可以是具有任何值的任何类型的整数变量的。

[编辑]在主题“重复问题”。我没有发现涉及if语句的任何问题。

+4

绝对没有区别,无论如何。 –

+0

可能的重复[C/C++布尔类型总是保证为0或1时,类型转换为int?](http://stackoverflow.com/questions/4276207/is-cc-bool-type-always-guaranted将0或1的时候指定为int) – Andrew

+1

我不同意大家说'没有区别'。显然有区别。第一个版本比第二个版本长5个字符。 – SergeyA

回答

6

if条件中所需的表达式的类型是布尔值。表达式intVar!=0已经是布尔值,表达式intVar的类型为int,并且需要隐式转换为布尔值。恰巧intbool的转换规则恰恰是,任何非零映射到true和零映射到false,因此得到的表达式评估完全相同。

有时写满intVar!=0可以增加清晰度(例如,为了清楚你不是评估nullptr的指针类型,而是用于零的整数类型),而其他时候则不是 - 它确实取决于在上下文中。

关于要求的参考,我将使用standard。与转化[conv.bool]的部分:

4.14布尔转换

算术,无作用域枚举,指针,或指针的构件类型A prvalue可以被转换为一个 prvalue类型的布尔。零值,空指针值或空成员 指针值被转换为false;任何其他值被转换为 真

+0

我开始认为这可能是正确的答案,但你能否引用任何参考? – Rama

+0

@拉玛标准草案可在线获取。搜索“转换”。 – molbdnilo

4

在C++(以及许多其他语言)中,没有任何区别,因为任何非零值都是“truey”而零本身就是“falsey”。

5

此外对其他的回答(和乐趣),我想地说,一个用户定义的类型的intVar限定的隐式转换操作者int和另一bool,这两个表达式可以有不同的行为:

#include <iostream> 

class Celcius 
{ 
    int _value; 
public: 
    Celcius(int value) : _value(value) {} 
    operator int() { return _value; } 
    operator bool() { return _value > -273; } 
}; 

int main() 
{ 
    Celcius waterBoilingPoint(0); 

    if (waterBoilingPoint != 0) { // false 
     std::cout << "This is not Standard Conditions for Temperature and Pressure!\n"; 
    } 

    if (waterBoilingPoint) { // true 
     std::cout << "This is not 0K (pun intended).\n"; 
    } 
} 

但这是一个边缘的情况下我也不会跳进去。

+2

优秀点。 – SergeyA

+0

不错!这是最无聊的问题最有趣的答案:) – Venemo

相关问题