12

他のいくつかの言語で使用するように、Java の if ステートメントで代入演算子を使用できないことはわかっています。

あれは

            int a;

            if(a = 1) {  } 

コンパイルエラーになります。

しかし、次のコードは問題なく動作します。

           boolean b;

           if(b = true) {   }

編集: これは、if ステートメントで代入を使用できないというルールの例外ですか。

4

5 に答える 5

39

割り当ての「結果」は割り当てられた値であるためboolean、2番目のケースでも式です。if式では、条件が式booleanである必要があります。これは、2 番目の式では満たされますが、最初の式では満たされません。事実上、2 つのスニペットは次のとおりです。

int a;

a = 1;
if (a) { }

boolean b;

b = true;
if (b) { }

その展開から、2 番目のバージョンはコンパイルされますが、最初のバージョンはコンパイルされないことは明らかですか?

これは、true と false を直接比較しない理由の 1 つです。したがって、私は常にif (b)代わりにif (b == true)andif (!b)の代わりに書くだけですif (b == false)if (b == c確かに、 ) whenbおよびcareboolean変数で問題が発生します。タイプミスが問題を引き起こす可能性があります。私はそれが私に起こったことがあるとは言えません。

編集: 編集への応答 - すべての種類の割り当てをifステートメントで使用できます - およびwhileループなど、全体的な条件式がboolean. たとえば、次のような場合があります。

String line;
while ((line = reader.readLine()) != null)
{
    // Do something with a line
}

は通常、条件の副作用を避けますが、この特定のイディオムは、上記の例やInputStream.read. 基本的には、「読んだ値が役に立つ間はそれを使用してください」です。

于 2010-03-06T20:20:34.690 に答える
10

booleanifに評価される式が必要なためです。boolean に評価されますが、割り当ては常に割り当てられた値に評価されるため、intに評価されます。b = truea = 1

于 2010-03-06T20:20:24.253 に答える
1

2 番目のコードが正常に機能する理由は、'b' に true の値を代入し、b が true か false かを比較するためです。これができる理由は、if ステートメント内で代入演算子を実行でき、かつブール値自体と比較できるためです。if(true) を実行するのと同じです。

于 2010-03-06T20:21:13.330 に答える
1

Java では、暗黙のキャストはありません。したがって、非ブール値または自動的にブール値に変換されません。

最初のケースでは、ステートメントの結果は int であり、これは非ブール値であり、機能しません。最後のケースでは、結果はブール値であり、if ステートメントで評価できます。

于 2010-03-06T20:23:12.063 に答える
1

ルールは、「ステートメントで代入を使用できない」ということではなく、「ifステートメントの条件ifは型でなければならないboolean」ということです。代入式は、代入される型の値を生成するため、値を代入するif場合、Java はステートメントでの代入のみを許可しbooleanます。

これは、このスタイルif (foo == true)を避け、代わりに単純にif (foo).

于 2010-03-06T20:23:56.587 に答える