13

以下のコードが a = 1 に対してのみ true を返すのはなぜですか?

main(){
int a = 10;
if (true == a)
     cout<<"Why am I not getting executed";
}
4

11 に答える 11

38

Bool true が int に変換されると、常に 1 に変換されます。したがって、コードは次のようになります。

main(){
   int a = 10;
   if (1 == a)
      cout<<"y i am not getting executed";
   }

これはC++ 標準の一部であるため、すべての C++ 標準準拠のコンパイラで発生することが予想されるものです。

于 2008-09-29T12:08:55.383 に答える
26

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";
}
于 2008-09-29T12:09:08.563 に答える
5

ブール値は整数に昇格され、1 になります。

于 2008-09-29T12:06:27.930 に答える
3

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";
}
于 2008-09-29T12:12:26.980 に答える
2

true は 1 であるため、ゼロ以外の値について a をテストする場合は、if(a) と記述します。

于 2008-09-29T12:06:25.187 に答える
1

これについて警告するコンパイラに切り替えることをお勧めします...手元に別のコンパイラがありません。)

Lou Franco に同意します。変数が 0 より大きい (または等しくない) かどうかを知りたい場合は、それをテストしてください。

最後の詳細を知らなければ、コンパイラによって暗黙的に行われるすべてのことは危険です。

于 2008-09-29T12:27:59.470 に答える
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";
}
于 2008-09-29T12:35:22.150 に答える
-1

そのコードが定義されているとは思いませんし、コンパイラーが提供する動作に依存するべきではありません。おそらく true は int (1) に変換されており、a は bool (true) に変換されていません。あなたが何を意味するか (a != 0) を書く方が良いです (定義されていることが判明したとしても)。

于 2008-09-29T12:07:21.737 に答える
-1

0 以外 (つまり false) は必要ありません true (つまり 1)

于 2008-09-29T12:07:22.517 に答える
-2

ブール値は C/C++ のビットであり、true は 1、false は 0 で表されるためです。

更新: コメントで述べたように、私の元の回答は誤りです。だからそれをバイパスします。

于 2008-09-29T12:07:25.587 に答える
-2

true は 1 に等しいためです。これはプリプロセッサ ディレクティブで定義されているため、true を含むすべてのコードはコンパイル時に 1 に変換されます。

于 2008-09-29T12:07:38.787 に答える