2016-08-18 2 views
1

次のコードがあります。それに問題なし:Javaのプリインクリメント

左< = B trueを返すいくつかの配列インデックス、(b)は、以下のヘルパー関数である
while (++left < to && less(a[left], a[from])); 

。 - A [<から=配列インデックス<へ]配列

私は特にこれより上位のコードの違いを理解していない:私は全体の発現の前に、preincreementのevaluetesを読んでいるよう

while (left < to && less(a[++left], a[from])); 

をしかし、それは事例ではありません(私が最初にそれを使用したとき、私は例外から外れています)。 誰かがこの問題を明確にすることはできますか?

APPEND:以下のため コード:配置の間

private boolean less(T a, T b) { 
     return a.compareTo(b) <= 0; 
} 
+0

問題の一部は、&&短絡である可能性があります。私は完全な説明をすることはできませんが、むしろあいまいでないように書き直したいので、そのような詳細については心配する必要はありません。 (「less」のコードを表示するのに役立つかもしれません) – JETM

+1

"preincrementは全体表現の前に評価されます"という文脈から外れているか、ソースがあいまいであると説明しているか、誤解しています。この場合の「式」は、式++が適用された式を意味するだけで、その式が出現する式全体ではありません。評価の順序は、演算子の優先順位によって厳密に規定され、次に左から右に向かいます。 – Durandal

+0

@ Durandalありがとうございました。 –

答えて

1

一つの違いはto-1に等しいときleft++を実行ないから来ている:これは<falseに評価すること、++lefttoに等しいことを意味。これにより、&&の短絡のために、less(...)への呼び出しが省略され、例外が防止されます。

あなたはa[++left]++を移動すると、あなたはleftto-1に達したときに範囲外の例外をスロー1回の以上の繰り返し、で終わります。プリインクリメントの後、lefttoに等しくなります。これはアレイの範囲外です。

0

第2のスニペットでは、最初の条件は最大値to - 1までtrueに評価されます。プリインクリメントのためにleft値がtoに等しい第2条件が評価されます。これは、境界外のインデックス例外を引き起こす可能性があります。

+0

私の答えがどこかでポイントを逃したなら、こんにちは、私の悪いです。しかし、正確ではなかったことを正確に知ることは本当に良いでしょう。ありがとう。 –

+0

それは例外であることを明らかにしました。私はそれを理解することができました。私の問題は、「表現の前に評価する」というフレーズが、プレインクリメント用の表現にのみ適用され、プリインクリメントは、Durandalの表現で表現される通常のオペレータのように扱われるという誤解であるということでした。ご回答有難うございます。 –

関連する問題