2013-09-27 77 views
51

Oto kod, który muszę wymyślić, jak to jest możliwe. Mam wskazówkę, ale nie wiem, jak to zrobić. Myślę, że chodzi o liczby ujemne i dodatnie, a także o modyfikatory zmiennych. Jestem początkującym i wszędzie szukałem rozwiązania, ale nie mogłem znaleźć niczego użytecznego.W jaki sposób "a <= b && b <= a && a! = B" może być prawdziwe?

pytanie jest następujące: Musisz zadeklarować i zainicjować dwie zmienne. Warunek if musi być prawdziwy.

kod:

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

Doceniam poświęcenie czasu.

+1

dla "int", nie sądzę, że "jeśli" kiedykolwiek ocenia "prawda" –

+0

Nie byłbym zaskoczony, gdyby było połączenie liczb zmiennoprzecinkowych, gdzie to działa. – Thilo

+0

Zajrzałem do -0F i 0F, ale nie zrobią tego. Myślę, że Henry jest zamierzoną odpowiedzią. – erickson

Odpowiedz

92

Nie jest to możliwe w przypadku typów pierwotnych. Można to osiągnąć z pudełkowych liczb całkowitych:

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

W <= i >= porównania użyje wartości bez opakowania 1, podczas gdy != porówna referencje i uda, ponieważ są one różne obiekty.

+5

Te subtelności w nowych funkcjach przykręconych do Java 5 są po prostu okropne ... Co za potencjalne błędy. – Thilo

+5

@Thilo Istnieje powód, dla którego są one nazywane subtelnościami.Myślę, że nie ma nic złego w powyższej subtelności. –

+2

@Thilo zgodził się, auto-boxing i -boksowanie jest wygodne tylko wtedy, gdy wiesz dokładnie, co robisz. – Henry

20

To działa zbyt:

Integer a = 128, b = 128; 

To nie:

Integer a = 127, b = 127; 

Auto-boks int jest cukier syntaktyczny dla wywołania Integer.valueOf(int). Ta funkcja używa pamięci podręcznej dla wartości mniejszych niż 128. Tak więc przypisanie 128 nie ma trafienia w pamięci podręcznej; tworzy nową instancję Integer przy każdej operacji automatycznego boksu, a a != b (porównanie porównawcze) jest prawdziwe.

Przypisanie 127 ma trafienie w pamięci podręcznej, a powstałe obiekty Integer są naprawdę tym samym wystąpieniem z pamięci podręcznej. Zatem porównanie odniesienia a != b jest fałszywe.

+5

Należy zauważyć, że * dokładna * granica tego, co jest buforowane, nie jest określona w specyfikacji. –

+1

@JoachimSauer Przedział czasu [-128, 127] musi być buforowany, zgodnie ze specyfikacją, więc 127 na przykład zawsze zawiedzie. Wartości przekraczające ten interwał * mogą * być buforowane, co może spowodować awarię. – erickson

11

Innym rzadkim przypadkiem dla zmiennych klasowych może być to, że inny wątek może zmienić wartości a i b podczas wykonywania porównania.