2013-09-27 24 views
51

Ecco il codice che devo capire come è possibile. Ho un indizio ma non so come farlo. Penso che riguardi i numeri negativi e positivi e forse anche i modificatori delle variabili. Sono un principiante ho cercato la soluzione ovunque ma non ho trovato nulla di utile.Come può "a <= b && b <= a && a! = B" essere vero?

la domanda è: È necessario dichiarare e inizializzare le due variabili. La condizione if deve essere vera.

il codice:

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

Apprezzo che il tempo.

+1

per 'int', non penso che il' if' valuti mai 'true' –

+0

Non sarei sorpreso se ci fosse una combinazione di numeri in virgola mobile dove questo funziona. – Thilo

+0

Ho esaminato -0F e 0F, ma non lo faranno. Penso che Henry sia la risposta voluta. – erickson

risposta

92

Questo non è possibile con i tipi primitivi. È possibile ottenere con numeri interi in scatola:

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

I <= e >= confronti useranno il valore unboxed 1, mentre il != metterà a confronto i riferimenti e riuscirà poiché sono oggetti diversi.

+5

Queste sottigliezze nelle nuove funzionalità imbullonate su Java 5 sono semplicemente terribili ... Che potenziale bug. – Thilo

+5

@Thilo C'è un motivo per cui sono chiamate sottigliezze.Non penso che ci sia qualcosa di sbagliato nella sottigliezza di cui sopra. –

+2

@Thilo concordato, auto-boxing e -unboxing è utile solo se sai esattamente cosa stai facendo. – Henry

20

Questo funziona troppo:

Integer a = 128, b = 128; 

Questo non lo fa:

Integer a = 127, b = 127; 

Auto-boxing un int è zucchero sintattico per una chiamata a Integer.valueOf(int). Questa funzione utilizza una cache per valori inferiori a 128. Pertanto, l'assegnazione di 128 non ha un hit cache; crea una nuova istanza Integer con ciascuna operazione di auto-boxing e a != b (confronto di confronto) è vera.

L'assegnazione di 127 ha un riscontro cache e gli oggetti Integer risultanti sono in realtà la stessa istanza dalla cache. Quindi, il confronto di riferimento a != b è falso.

+5

Si noti che il limite * esatto * di ciò che è memorizzato nella cache non è specificato nelle specifiche. –

+1

@JoachimSauer L'intervallo [-128, 127] deve essere memorizzato nella cache, in base alle specifiche, quindi 127, ad esempio, avrà sempre esito negativo. I valori oltre quell'intervallo * potrebbero * essere memorizzati nella cache, il che causerebbe un errore. – erickson

11

Un altro raro caso per variabili di classe potrebbe essere che un altro thread potrebbe modificare i valori di a e mentre il confronto è in esecuzione.

Problemi correlati