2012-05-09 20 views
6

La parte en la que sigo atascado es boolean(0 % 2 !=0) == false. Quiero decir, si 2 entra en 0, 0 veces, el resto sería 2 y 2 no igual a 0. Entonces, debería ser cierto. Sin embargo, cuando pongo el booleano en mi programa java, lo trato como falso. Alguien sabe por qué?`java (0% 2! = 0) == false`

La única respuesta lógica que puedo entender es que tal vez los números enteros van a 0 y un número infinito de veces, por lo que se reconocen como falsos, ¿alguien?

+0

Estoy seguro de que no es un error de codificación, copié esto directamente de mi libro, también se lo menciona varias veces en mi conferencia. – Michael

+0

Eso es ... no lo que '%' significa. –

Respuesta

24

hay dos pasos:

  • 0 % 2 evalúa a 0.

  • 0 != 0 evalúa a false.

elaborar en el primer paso, el JLS defines el operador % así:

El operador binario% se dice para producir el resto de sus operandos de una división implícita; el operando de la izquierda es el dividendo y el operando de la derecha es el divisor.

El resto de la división por 02 es 0 y no 2 como pareces pensar.

+5

Normalmente no hago +1 cosas realmente básicas, pero por alguna extraña razón, esta me hizo reír. – Mysticial

2

% devuelve el resto después de la división. Cero dividido por cualquier cosa (¡excepto por sí mismo!) Es cero, por lo que no hay resto.

Por lo tanto, 0 % 2 es 0.

+4

Cero dividido por cualquier cosa * excepto cero * es cero – aioobe

+0

Esta matemática moderna es tan desconcertante :-) –

+0

Ja ja, buena captura :) ¡Reparado! –

4

0% 2 = 0, debido a 0/2 = 0 y 0 recordatorio, o 0 * 2 + recordatorio = 0.

que acaba módulo mal entendido.

0

si 2 entra en 0, 0 veces y luego el resto serían 2.

no es 2 goes into 0 pero 0 goes into 2, por lo que el resultado de la devisiones es 0 y el recordatorio es 0.

+1

Te refieres a "división" y "resto" ... (Recordatorio es lo que escribes en una nota de Postit, y devision no es una palabra en inglés ... aunque podría ser un eufemismo para una forma de tortura medieval. "el prisionero fue llevado al calabozo y 'ideado' con un atizador al rojo vivo".) –

1

Creo que mezcla el 0% 2 y el 2% 0 (lo que es imposible). 0% n es siempre igual a 0.

Ok, vamos a diseccionar que ...

1) 0 % 2

módulo es el resto de la división finito. Por ejemplo, 10% 3 es el resto de 10/3. 10/3 es 3 + ⅓. El resto es 1.

0% 2 es el resto de 0/2. 0/2 = 0, no hay descanso, por lo tanto 0% 2 = 0.

2) 0 % 2 != 0

Significa 0% 2 es diferente de 0. Ahora sabemos que es falsa.

3) boolean(0 % 2 != 0)

Se trata simplemente de fundición. Lanzas el resultado a un booleano. En lugar de simplemente ser una suposición falsa, obtiene el valor de Java false.

4) boolean(0 % 2 != 0) == false

El == significa que hay una prueba aquí. La prueba se puede simplificar (como se muestra arriba) como false == false. ¿Es false igual a false? Sí lo es. El resultado es entonces true.

0

Tiene que ver con la Precedencia del operador, que es el orden con el que los operadores son evaluados por el intérprete de Java.

Ver here para los documentos. Una acrónimo útil es BUDMASRELCA - B raquetas, U nary, D IV- M ultiplication (en realidad multiplicativo ya que incluye módulo), A ddittion- S ubtraction, R elational, E calidad, L ogical, C en adelante (ternario), A ssignment. He perdido operadores de Bitwise, pero se pueden agrupar en Logical, y tienen prioridad sobre los operadores lógicos normales.

0% 2! = 0 se evalúa como 0% 2 (multiplicativo) primero y luego se ha resultado 0 se evalúa con! = 0. (igualdad)

Internamente, los compiladores construir un árbol binario de expresión para representar el ordene como se muestra a continuación para su caso, usando operadores como raíces y hojas como valores u operadores adicionales (en el caso recursivo). Por lo tanto, los subárboles que tienen operadores deben evaluarse antes de que el operador raíz pueda evaluarse con el valor de sus hojas.

!= 
/\ 
% 0 
/\ 
0 2