3

Java の return ステートメントのブール変数の意味 (評価) について質問があります。

そんなこと知ってる:

if (var) { ... }

以下と同じです:

if (var==true) { ... }

2 番目のケースでは、var==true と明示的に言いますが、Java は var をとにかく true と評価するため、これを行う必要はありません。私はこの権利を理解したと思います。

私の質問は、ブール変数が返される場合と同じですか? いつリターンステートメントを持っていますか?

たとえば、タスクは次のように指定します。looksBetter() メソッドは、b < a の場合にのみ true を返します。私の解決策は次のとおりです。

public boolean looksBetter() {
     if (b < a) {
         return true;
     } else {
         return false;
     }
}

簡単な答えは次のとおりです。

public boolean lookBetter() {
      return b < a;
}

したがって、ここでも、b < a == true の場合、メソッドの戻り値は true であるという暗黙の仮定があるようです。申し訳ありません...とても些細なことのように思えますが、私はどういうわけかこれに慣れていません.理由はわかりません. ありがとうございました。

4

8 に答える 8

14

これは「暗黙の仮定」ではなく、コンパイラーが行っていることです。これは単なる式であり、ステートメントb < aに使用された場合と同じです。if式はに評価され、booleanその後返されます。

また注目に値するのは、あなたはそれらが同じであるかのように交換booleanしているように見えますが、実際にはそうではありません。はプリミティブフォームであり、はをラップするオブジェクトです。BooleanbooleanBooleanboolean

于 2009-01-29T20:26:46.097 に答える
11

はい、これはすべてのブール値に当てはまります。if(expression)が'expression'を評価して、それが'true'または'false'であるかどうかを確認することができます。あなたがするとき

if(b < a == true)

最初にb<aかどうかをテストし、そうである場合は次のテストを行います。

if(true == true)

true == trueかどうかをテストします(明らかにそうです)。余分な「==true」を省略しても、Javaはトリッキーなことは何もしていません。必要なのは、テストを1つ減らすだけです。あなたが言うことができなかった理由はありません:

if(((b < a == true) == true) == true)

ただし、等号が表示されるたびにJavaが追加のテストを実行することになります。

于 2009-01-29T20:27:01.730 に答える
5

コードを不必要に複雑にしないでください。「a<b== true」と言う必要があると感じた場合は、それに従って論理的な混乱(結論+混乱)を導き、「((((((((...(a<b) == true) == true).... == true)」と言うことができます。

「a<b」はブール式です。すでにブール値を持っている場合、なぜそれを別のブール値と比較するのですか?そのようにブール値にするわけではありません。

于 2009-01-29T20:27:28.420 に答える
1

演算子をメソッドとして考えようとすると、混乱が緩和される可能性があります。あなたの例を使用すると、<"lessthan"演算子があります。私たちの目的では、<演算子は実際には「メソッド」と見なすことができます(1つのようには見えません)。これは、2つのパラメーターを受け取り、ブール結果を返します。「メソッド」の名前がlessThanの場合、例は次のようになります。

public boolean lookBetter() {     
  return lessThan(b, a);     
} 

おそらく、そのように見ると、少し理解しやすくなりますか?ちなみに、私が大学の「プログラミング101」コースでエクササイズグループを率いていたとき、これは教えるのがはるかに難しいことがわかり、多くの人が関連する概念を理解するのに苦労しました。自転車に乗ったり泳いだりすることを学ぶのとほとんど同じように見えました。それがどのように機能するかを理解すると、ある意味で自明になります。

于 2010-10-25T08:57:34.333 に答える
1

Java 条件にはブール値が必要です。if ステートメントに入れることができれば、それはすでにブール値であり、必要なものがブール値である場合、それ以上いじる必要はありません。

実際、次のような構造value == trueは扱いにくい場合があります。Java での昇格規則は覚えていませんが、C++ では、bool を int に昇格させることができます。false は 0 になり、true は 1 になります。したがって、int a = 2; if (a)andint a = 2; if (a == true)は別のことを行います。

于 2009-01-29T20:34:38.563 に答える
0

C ++と同様に、演算子の左側にあるものも含め、すべてのステートメントに戻り値があります。私が見たクレイジーなC++のいくつかは、左側に操作があり、その結果が割り当てられています。

次のようにすると、うまく機能することがわかります。

bool result = (b > a);
return result;

それだけの理由は、デバッグが少し簡単です(ほぼすべてのIDEで)。私はいつもそれを括弧で囲んでいることがわかります、理由はよくわかりません。夜寝ている間、可変電子を暖かく保つと思います。

于 2009-01-29T20:28:00.027 に答える
0

なぜ概念的な問題を抱えているのかと尋ねていると思います。

基本的な問題は、ブール値を直接返すと、何かが欠けているということだと思います。あなたの場合のメソッド名です。

あなたのルックスベターは何の意味もありません。あなたが本当に考えていることはこれです:

boolean isEarlier(Time a, Time b) {
    if(a < b) //for simplicity let's ignore that this won't work.
        return true;
    else
        return false;
}

これで、次のように減らすことができます。

boolean isEarlier=a < b;

うーん、これで a が b よりも早いことがわかりました。これが中間値 isEarlier の意味です。

したがって、その中間値を内部化すると、これはより理にかなっています。

boolean isEarlier(Time a, Time b) {
    return a < b;
}

その「ブール値」は、単なる中間状態ではなく、実際の値と考える必要があります。不快に感じる場合は、自由に変数にしてください (実際には何もかかりませんし、今すぐ読みやすくなるかもしれません)。

後でコードを振り返ると、コードをより短い方法で見ることに慣れることができます。あなたの心が新しい道を育むには、ほとんどの場合時間がかかります。

于 2009-01-29T21:00:06.297 に答える
-2

メソッドは機能しますが、特にaとbという名前の変数がある場合は、正確に何が起こるかが少し不明確になる可能性があります。メソッドを文書化し、適切な名前の変数を作成する必要があります。

また、コードを書いた直後にコードが混乱する場合は、6か月以内に来て、何が起こっているのかわからない人を考えてみてください。適切なドキュメントとコメントが大いに役立ちます。

于 2009-01-29T20:29:37.793 に答える