2013-09-27 23 views
51

Hier ist der Code Ich muss herausfinden, wie es möglich ist. Ich habe eine Ahnung, aber ich weiß nicht, wie ich es machen soll. Ich denke, es geht um negative und positive Zahlen und vielleicht auch um die variablen Modifikatoren. Ich bin ein Anfänger, ich habe die Lösung überall gesucht, aber ich konnte nichts brauchbares finden.Wie kann "a <= b && b <= a && a! = B" wahr sein?

die Frage ist, dass: Sie müssen die zwei Variablen deklarieren und initialisieren. Die if-Bedingung muss wahr sein.

der Code:

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

Ich schätze Sie sich die Zeit nehmen.

+1

für 'int', ich glaube nicht, das' if' wertet je 'true' –

+0

ich wäre nicht überrascht, wenn es eine Kombination von Gleitkommazahlen, wo das funktioniert. – Thilo

+0

Ich schaute in -0F und 0F, aber sie werden es nicht tun. Ich denke, Henry ist die beabsichtigte Antwort. – erickson

Antwort

92

Dies ist mit primitiven Typen nicht möglich. Sie können es mit boxed Ganzen Zahlen erreichen:

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

Die <= und >= Vergleiche den unboxed Wert 1 verwenden, während die != wird die Referenzen vergleichen und wird erfolgreich sein, da sie unterschiedliche Objekte sind.

+5

Diese Feinheiten in den neuen Features von Java 5 sind einfach schrecklich ... Was für ein Potential für Bugs. – Thilo

+5

@Thilo Es gibt einen Grund, warum sie Feinheiten genannt werden.Ich denke nicht, dass mit der obigen Subtilität etwas falsch ist. –

+2

@Thilo stimmte zu, Auto-Boxen und -Unboxing ist nur praktisch, wenn Sie genau wissen, was Sie tun. – Henry

20

Dies funktioniert auch:

Integer a = 128, b = 128; 

Dies gilt nicht:

Integer a = 127, b = 127; 

Auto-Boxen ein int für einen Anruf zu Integer.valueOf(int) syntaktischer Zucker ist. Diese Funktion verwendet einen Cache für Werte kleiner als 128. Die Zuweisung von 128 hat also keinen Cache-Treffer; Es erstellt eine neue Integer Instanz mit jedem automatischen Boxvorgang und a != b (Referenzvergleich) ist wahr.

Die Zuweisung von 127 hat einen Cache-Treffer, und die daraus resultierenden Integer Objekte sind wirklich die gleiche Instanz aus dem Cache. Also ist der Referenzvergleich a != b falsch.

+5

Es sollte beachtet werden, dass die * exact * -Grenze des Zwischenspeichers nicht in der Spezifikation angegeben ist. –

+1

@JoachimSauer Das Intervall [-128, 127] muss entsprechend der Spezifikation zwischengespeichert werden, so dass beispielsweise 127 immer fehlschlägt. Werte außerhalb dieses Intervalls * dürfen * zwischengespeichert werden, was zu einem Fehler führen würde. – erickson

11

Ein weiterer seltener Fall für Klassenvariablen könnte sein, dass ein anderer Thread die Werte von a und b ändern könnte, während der Vergleich ausgeführt wird.

Verwandte Themen