2013-04-12 19 views
22

Miałem to pytanie z wywiadu kilka lat temu, ale jeszcze nie znalazłem odpowiedzi.Jak zrobić pętlę nieskończoną z "x <= y && x > = y && x! = Y"?

Co powinno być X i Y, aby zrobić nieskończoną pętlę?

while (x <= y&& x >= y && x != y) { 

} 

Próbowaliśmy z Nan, infinity+/-, null

float vs int.

+0

Jaki jest typ xiy. Czy są to prymitywy lub referencje, czy wolno im być kimkolwiek? – prashant

+2

Chcesz dwa wystąpienia tego samego numeru. '<=' and '> =' anuluj się tak długo, 'x jest równe y numerycznie' ale' x == y' jest sprawdzaniem referencji, ergo dwa wystąpienia zwrócą true na 'x! = y', nawet jeśli są równe wartości. – Shark

+9

YAUIQ - kolejne bezużyteczne pytanie dotyczące wywiadu. Ciekawe, a nawet zabawne, nie mam zastrzeżeń do umieszczania go tutaj dla rozrywki, a nawet uczenia się.Ale nie sądzę, że pomoże to nikomu ocenić, jak dobry jest pracownik programisty, z którym rozmawia. – arcy

Odpowiedz

37

Musisz dwie zmienne, które są porównywalne, mają taką samą wartość, ale reprezentują różne przypadki, na przykład:

Integer x = new Integer(0); 
Integer y = new Integer(0); 

x <= y i y <= x są zarówno prawdziwe, ponieważ Integer są unboxed jednak równość instancja x == y jest fałszywy.

Pamiętaj, że działa również z Float, Long i Double i działa dowolna wartość (nie tylko 0).


Można również grać z zawiłości swojej JVM - one zazwyczaj buforować całkowita do 127 tylko, więc to będzie działać zbyt:

Integer x = 128; 
Integer y = 128; 

(ale nie ze 127).

Albo prościej, ponieważ Double s generalnie nie są buforowane w ogóle:

Double x = 0d; 
Double y = 0d; 
+3

... porównywalne z '<=' and '> =', ... które są tylko prymitywne opakowania (z wyjątkiem Boolean). – Dukeling

+0

To jest jakaś diabelska sztuczka z boksowaniem. Dobra odpowiedź. Ludzie, którzy to czytają, powinni także wypróbować 'Integer.valueOf (0)' i zobaczyć, jak to wpływa na wynik. –

+0

(+1) Clever! ... – NPE

5

trzeba utworzyć dwa Integer obiektów, na przykład:

Integer x = new Integer(2); 
Integer y = new Integer(2); 

Ponieważ x i y są obiektami i bez typów porządkowych, otrzymujesz nieskończoną pętlę.

0

Oto ona.

Integer x =1; 
Integer y = new Integer(1); 
while(x <= y&& x >= y && x != y) { 
    System.out.println("Success"); 
} 
+1

Mogłem poszedł o krok dalej i zadeklarowałem 'y = new Integer (x);' – Shark

2

Masz odpowiedź, chciałem tylko powiedzieć, jak doszłam do tego samego. W normalnym świecie taki test byłby bezużyteczny, nie ma możliwości, żeby dwie liczby działały w ten sposób. Oznacza to, że musi on być specyficzny dla języka Java.

x i y mogą być albo typami prostymi, co sprawia, że ​​jest to niemożliwe od razu.

x i y mogą być obiektami. Ale jakie przedmioty są porównywane z < = lub> =? Tylko numery "pudełkowe". Tak więc odpowiedź pojawia się bardzo szybko.

Powiązane problemy