以下のコードが a = 1 に対してのみ true を返すのはなぜですか?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
以下のコードが a = 1 に対してのみ true を返すのはなぜですか?
main(){
int a = 10;
if (true == a)
cout<<"Why am I not getting executed";
}
Bool true が int に変換されると、常に 1 に変換されます。したがって、コードは次のようになります。
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
これはC++ 標準の一部であるため、すべての C++ 標準準拠のコンパイラで発生することが予想されるものです。
print ステートメントが実行されない理由は、ブール値が暗黙的に数値に変換されるためです。つまり、if ステートメントはこれと同等です: if (1 == a)
最初に明示的にブール値に変換することで、これを回避できます。
main(){
int a = 10;
if (((bool)a) == true)
cout<<"I am definitely getting executed";
}
C/C++ では、false は 0 として表されます。
それ以外はすべて非ゼロとして表されます。1 の場合もあれば、それ以外の場合もあります。したがって、真である何かと等しい (==) かどうかをテストするべきではありません。
代わりに、偽である何かと等しいかどうかをテストする必要があります。false には有効な値が 1 つしかないためです。
ここでは、false 以外のすべての値をテストしていますが、どれでも問題ありません。
main(){
int a = 10;
if (a)
cout<<"I am definitely getting executed";
}
そして、false と見なされる整数を false (0 のみ) と比較しても安全であることを証明するための 3 番目の例:
main(){
int a = 0;
if (0 == false)
cout<<"I am definitely getting executed";
}
ブール値は整数に昇格され、1 になります。
C および C++ では、0 は false で、0 以外は true です。
if ( 0 )
{
// never run
}
if ( 1 )
{
// always run
}
if ( var1 == 1 )
{
// run when var1 is "1"
}
コンパイラがブール式を計算するとき、0 または 1 を生成する義務があります。また、式で 1 と 0 の代わりに「true」と「false」を使用できる便利な typedef と定義がいくつかあります。
したがって、コードは実際には次のようになります。
main(){
int a = 10;
if (1 == a)
cout<<"y i am not getting executed";
}
あなたはおそらく欲しい:
main(){
int a = 10;
if (true == (bool)a)
cout<<"if you want to explicitly use true/false";
}
または本当にただ:
main(){
int a = 10;
if ( a )
cout<<"usual C++ style";
}
true は 1 であるため、ゼロ以外の値について a をテストする場合は、if(a) と記述します。
これについて警告するコンパイラに切り替えることをお勧めします...手元に別のコンパイラがありません。)
Lou Franco に同意します。変数が 0 より大きい (または等しくない) かどうかを知りたい場合は、それをテストしてください。
最後の詳細を知らなければ、コンパイラによって暗黙的に行われるすべてのことは危険です。
ほとんどの人がその種のコードを書く方法は次のとおりです。
main(){
int a = 10;
if (a) // all non-zero satisfy 'truth'
cout<<"y i am not getting executed";
}
私も見ました:
main(){
int a = 10;
if (!!a == true) // ! result is guaranteed to be == true or == false
cout<<"y i am not getting executed";
}
そのコードが定義されているとは思いませんし、コンパイラーが提供する動作に依存するべきではありません。おそらく true は int (1) に変換されており、a は bool (true) に変換されていません。あなたが何を意味するか (a != 0) を書く方が良いです (定義されていることが判明したとしても)。
0 以外 (つまり false) は必要ありません true (つまり 1)
ブール値は C/C++ のビットであり、true は 1、false は 0 で表されるためです。
更新: コメントで述べたように、私の元の回答は誤りです。だからそれをバイパスします。
true は 1 に等しいためです。これはプリプロセッサ ディレクティブで定義されているため、true を含むすべてのコードはコンパイル時に 1 に変換されます。