108 votes

Comment peut-on différent de lui-même une variable Java ?

Je me demande si cette question peut être résolue en Java (je suis nouveau sur le langage). C’est le code :

J’ai reçu la question suivante dans mon labo : comment vous pouvez ignorer le premier cas (c'est-à-dire faire le `` faux condition) sans modifier l’État lui-même ?

174voto

arshajii Points 65653

Un moyen simple est d'utiliser Float.NaN:

float x = Float.NaN;  // <--

if (x == x) {
    System.out.println("Ok");
} else {
    System.out.println("Not ok");
}
Pas ok

Vous pouvez faire de même avec Double.NaN.


De JLS §15.21.1. L'Égalité numérique des Opérateurs == et !=:

Virgule flottante égalité d'essais est effectuée en conformité avec les règles de la norme IEEE 754:

  • Si l'un des deux opérandes est NaN, alors le résultat de l' == est false , mais le résultat d' != est true.

    En effet, le test x!=x est true si et seulement si la valeur de x est NaN.

...

158voto

Jeroen Vannevel Points 18676
int x = 0;
if (x == x) {
    System.out.println("Not ok");
} else {
    System.out.println("Ok");
}

147voto

Richard Tingle Points 8054

Par le Langage Java Spécifications NaN n'est pas égal à NaN.

Par conséquent, toute ligne qui a provoqué x être égale à NaN serait à l'origine, comme

double x=Math.sqrt(-1);

À partir de le Langage Java Spécifications:

Virgule flottante opérateurs produire aucune exception (§11). Une opération qui déborde produit signé de l'infini, une opération qui underflows produit une valeur anormale ou un signé zéro, et un opération qui n'a pas mathématiquement définie résultat produit NaN. Tous numérique opérations avec NaN comme un opérande produire NaN. Comme a déjà été décrite, NaN n'est pas ordonné, donc une comparaison numérique opération impliquant un ou deux NaNs retourne false et tout != comparaison impliquant NaN renvoie true, y compris les x!=x lorsque x est NaN.

73voto

Pshemo Points 34648

Pas sûr si il s’agit d’une option mais changeantes de variable locale à un champ permettrait aux autres threads changer sa valeur entre la lecture à gauche et à droite dans déclaration.

Voici la courte démo :

Ouptut :

56voto

Mex Points 500

Le remplacement de la ligne pouvait lire.

double x = Double.NaN;

Ce serait la cause de la chasse aux sorcières à être imprimé.

Java Langage de Spécification (JLS) dit:

Virgule flottante opérateurs produire aucune exception (§11). Une opération qui déborde produit signé de l'infini, une opération qui underflows produit une valeur anormale ou un signé zéro, et une opération qui n'a pas mathématiquement définie résultat produit NaN. Toutes les opérations numériques avec NaN comme un opérande produire NaN. Comme cela a déjà été décrit, NaN n'est pas ordonné, donc une comparaison numérique de l'opération impliquant un ou deux NaNs renvoie la valeur false et tout != comparaison impliquant NaN renvoie true, y compris les x!=x lorsque x est NaN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X