2011-11-04 7 views
23
while(i <= j && i >= j && i != j) {} 

cómo declarar i y j para que sea un ciclo infinito?cómo declarar i y j para que sea un ciclo infinito?

// es una pregunta de la entrevista que conocí.

pregunta cuáles son las declaraciones de i y j, haz que sea siempre verdad.

Y no puedo distinguirlo declarando i y j como tipos de números. ¿Qué otros tipos pueden cumplirlo?

+0

donde estoy? ... – Kasturi

+0

@DJClayworth ¿Qué quiere decir con "' || 'versión?" –

+0

@ Alan, muy buena pregunta +1 – ELAYARAJA

Respuesta

38
Integer i=new Integer(1000); 
Integer j=new Integer(1000); 

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j)); 

ij y será automáticamente sin caja de enteros para <= y >=, pero no para !=. i y j son instancias diferentes, pero tienen el mismo valor int. Es por eso que las tres comparaciones volverán verdaderas.

+2

bien, creo que es la respuesta correcta. Al menos está volviendo verdadero.// ¡Qué pregunta difícil de entrevista! – Alan

+0

Solo golpéame. – DJClayworth

+1

+1 'i <= j && i > = j && i! = J' [se evalúa como' verdadero' en este caso, luego] (http://ideone.com/G1xjn) –

-2

Cualquier valor igual de 'i' y 'j' a revelar la verdadera con la declaración dada, dicen:

Integer i = new Integer(1); 
Integer j = new Integer(1); 

while(i <= j && i >= j && i != j) {} 

La magia es usada con el operador! En el caso del operador! =, El compilador toma los operandos como objetos (incluidos sus valores), mientras que en el caso de> = o < = el compilador solo toma el valor de los operandos. Por lo tanto, la declaración anterior devuelve verdadero.

3

Esto funciona también ("en mi máquina"):

Integer a = 128, b = 128; 

mientras que esto no va a funcionar:

Integer a = 127, b = 127; 

Auto-boxing un int es el azúcar sintáctica para una llamada a Integer.valueOf(int). Esta función usa una memoria caché para valores de -128 a 127, inclusive. Es puede caché de otros valores, pero en mi caso, no es así.

Por lo tanto, la asignación de 128 no tiene un golpe de caché; crea una nueva instancia de Integer con cada operación de autoenlace, y la comparación de referencia a != b es verdadera. La asignación de 127 tiene un valor de caché, y los objetos resultantes Integer son en realidad la misma instancia de la memoria caché. Entonces, la comparación de referencia a != b es falsa.

Lo que realmente quiero señalar es tener cuidado con la comparación de referencia con el auto-boxeo. Un problema más probable en el mundo real es que esperas que a == b sea cierto porque se les asignó el mismo valor (automático), ejecutas algunas pruebas de unidad que confirman tus expectativas y luego tu código falla "en la naturaleza" cuando algún contador excede el límite superior de la memoria caché. ¡Tiempos divertidos!

+0

+1 ¡Gran adición a [la respuesta de Banthar] (http://stackoverflow.com/a/8015528/2932052)! – Wolf

Cuestiones relacionadas