4

trueを返すと予想されるときにfalseを返す次の Java コード スニペットがあります。

assertTrue(true || false ? false : false);

ステートメントは、この投稿のために単純化されています (元々は文字列比較を使用していました)。三項演算子を使用しないように単純化できることはわかっていますが、基本的には、Java がこのように評価する理由を理解しようとしています。 :

(true || false) ? false : false

これではなく:

true || (false ? false : false)

trueを評価して終了することを期待しています。なぜそうしないのか誰か知っていますか?

4

4 に答える 4

15

演算子の優先順位のため。論理 AND と論理 OR は、三項演算子よりも優先順位が高いため、最初に動作します。

于 2013-07-09T13:11:38.890 に答える
11

||よりも優先順位が高いためです?:Java の演算子の表を次に示します。の||位置は 13?:ですが、位置は 14 です。

于 2013-07-09T13:11:30.027 に答える
5

それが言語仕様に書かれていることだからです。文法の関連ビットは次のとおりです。

Expression: 
     Expression1 [AssignmentOperator Expression1]

Expression1: 
     Expression2 [Expression1Rest]

Expression1Rest: 
     ? Expression : Expression1

Expression2:
     Expression3 [Expression2Rest]

Expression2Rest:
     { InfixOp Expression3 }
     instanceof Type


InfixOp: 
     || 
     &&
     // and many other operators

したがって、 を解析するA || B ? C : Dには、 はである? C : D必要がありExpression1Rest、 a の右側は である||必要があります。これには、三項条件式が含まれExpression3ていませ(括弧で囲まれている場合を除きます。括弧で囲まれた式は常に として受け入れられますExpression3)。したがって、 をA || Bとして解析しExpression3、式全体を であるかのように解析する必要があり(A || B) ? C : Dます。

于 2013-07-09T13:23:16.860 に答える
2

そのため、「演算子の優先順位」と呼ばれるものがあります。数学の演算順序と同じ概念です。+数学では の後に来るように*、Java では の後に?:||ます。

なぜこれがこのようなのですか?ifさて、三項をステートメントに展開すると考えると役立つと思います。

true || false? false: false;
// literally maps to
if(true || false) false; else true;
于 2013-07-09T13:13:01.490 に答える