2013-09-27 19 views
51

これはどのようにそれが可能であるかを把握しなければならないコードです。私は手がかりを持っていますが、私はそれを行う方法を知らない。私はそれが負の数と正の数について考えているかもしれませんし、おそらく可変修飾子でもあると思います。私は初心者ですが、私はどこでも解決策を見ていましたが、何も使えませんでした。「a <= b && b <= a && a!= b」はどのように真実になりますか?

質問は次のとおりです。2つの変数を宣言して初期化する必要があります。 if条件が真でなければなりません。

コード:

if(a <= b && b <= a && a!=b){ 
     System.out.println("anything..."); 
} 

私はあなたが時間を割いて感謝しています。

+1

、私は' if'が今までこの作品浮動小数点数の組み合わせがある場合、私は驚かないだろうtrue'を –

+0

'に評価されないと思います。 – Thilo

+0

-0Fと0Fを調べましたが、それはしません。私はヘンリーが意図された答えだと思う。 – erickson

答えて

92

これはプリミティブ型では不可能です。あなたは箱入り整数でそれを達成することができます:!=は参照を比較し、それらが異なるオブジェクトであるため、成功する一方で

Integer a = new Integer(1); 
Integer b = new Integer(1); 

<=>=比較は、ボックス化解除値1を使用します。

+5

Java 5に組み込まれた新機能のこれらの微妙な点は、ひどい...バグの可能性 – Thilo

+5

@Thilo微妙な理由があります。私は上記の微妙なことに何か間違っているとは思わない。 –

+2

@Thiloは、あなたが何をしているのか正確に分かっている場合にのみ便利です。 – Henry

20

これはあまりにも動作します:

Integer a = 128, b = 128; 

これにはない:

Integer a = 127, b = 127; 

intInteger.valueOf(int)への呼び出しのための構文糖であるオートボクシング。この関数は、128未満の値に対してキャッシュを使用します。したがって、128の割り当てにキャッシュヒットはありません。各自動ボクシング操作で新しいIntegerインスタンスが作成され、a != b(参照の比較)がtrueになります。

127の割り当てにキャッシュヒットがあり、結果として得られるIntegerオブジェクトは実際にはキャッシュと同じインスタンスになります。したがって、参照の比較a != bはfalseです。

+5

キャッシュされているものの*正確な*境界は仕様で指定されていないことに注意してください。 –

+1

@JoachimSauer間隔[-128,127]は、仕様に従ってキャッシュされなければならないため、たとえば127は常に失敗します。その間隔*を超える値がキャッシュされる可能性があります。これは失敗の原因となります。 – erickson

11

クラス変数の別のまれなケースは、比較が実行されている間に別のスレッドがabの値を変更できる可能性があります。 int` `ため

関連する問題