2016-12-05 11 views
1

私は、これらの2つのブロックがC++のブロックに違いがあるかどうかを知ることに興味があります。 答えがあれば、参考文献を挙げることができれば非常に便利です。if(intVar)とif(intVar!= 0)の間に違いはありますか?

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

intVar

if (intVar) 
{ 
    //Do samething 
} 

は、任意の値を有する整数変数の任意のタイプであってもよいです。

[EDIT]件名「重複した質問」について私はif文が関係していることについて、これについて何の疑問も見つけませんでした。

+4

違いはありません。 –

+0

[C/C++のbool型はint型にキャストされたとき常に0または1になることが保証されていますか?](http://stackoverflow.com/questions/4276207/is-cc-bool-type-always-guaranteed -0-or-1-when-typecasted-to-int) – Andrew

+1

私は誰もが「違いはありません」と言って違うことを願います。明らかに違いがあります。最初のバージョンは2番目のバージョンより5文字長くなります。 – SergeyA

答えて

6

ifで必要な式の型はブール値です。式intVar!=0はすでにブール型であり、式intVarはタイプintであり、ブール値への暗黙的な変換が必要です。それが起こると、intboolの変換ルールは、ゼロ以外のものがtrueにマップされ、ゼロがfalseにマップされるため、結果の式の評価はまったく同じです。

ときどき完全なintVar!=0を書くと、明瞭さが増します(たとえば、nullptrのポインタタイプを評価していないことを明確にすることができます)。文脈で

要求された参考文献に関しては、standardを使用します。コンバージョン[conv.bool]に関連するセクション:メンバー型に

4.14ブール変換

算術、スコープ外の列挙、ポインタ、またはポインタのprvalue型の prvalueに変換することができます。ブールゼロ値、ヌルポインタ値、またはnullメンバ ポインタ値はfalseに変換されます。他の値が 真

の他の回答(と楽しみのため)にさらに
+0

私はこれが正解かもしれないと思っていますが、あなたは参考文献を挙げることができますか? – Rama

+0

標準の@Ramaドラフトはオンラインで入手できます。 「コンバージョン」を検索します。 – molbdnilo

4

C++(および他の多くの言語)では、ゼロ以外の値が「truey」でゼロ自体が「偽」であるため、違いはありません。

5

に変換されて、私は、ユーザー定義型のintVarためintに暗黙の型変換演算子を定義することを言いたいと別の思いbool、2つの発現は異なる行動かもしれない:

#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

関連する問題