Quelle est la différence entre while (x = false) et while (!x) en Java?
Désolé, je suis nouveau sur Java, de sorte que cette question est peut-être pas clair.
J'ai été récemment traitant avec joignant un try et catch déclaration dans une boucle while, parce que je voulais assurez-vous que l'obtention d'entrée était fermée à partir du reste du programme.
J'ai rencontré un problème où l'aide d'un point d'exclamation (!) en face d'une variable dans le temps (par exemple while (!fait)) au lieu d'utiliser = false (par exemple, tandis que (done = false)) modifie la façon dont mon programme fonctionne.
L'ancien (!fait) des résultats de l'essai et à l'exception des déclarations de course comme prévu.
Le dernier (done = false) n'est pas, il suffit de les ignorer et de passer à la partie suivante du code.
J'étais sous l'impression que les ! avant une variable signifiait la même chose que var = false.
Suis-je trompé?
Voici un exemple:
import java.util.Scanner;
public class TestOne {
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int num;
boolean inputDone = false;
while (!inputDone) {
try {
System.out.print("Enter in a number here: ");
num = input.nextInt();
inputDone = true;
}
catch (Exception e) {
System.out.println(e);
System.exit(0);
}
}
System.out.println("Success!");
}
}
Actuellement, la compilation et l'exécution du programme se fait en douceur: il va me demander pour un certain nombre, en tapant une lettre ou un très long nombre de causes pour imprimer le type d'exception et de sortie. En tapant un nombre normal provoque l'impression de Réussite!
D'autre part, si j'étais à la place de !inputDone avec inputDone = false, il imprime simplement un Succès! quand je lance le programme.
Quelqu'un peut-il expliquer la différence pour moi entre les ! et l' = fausses déclarations dans une boucle while?
J'aime que la faute dans la question du titre est la raison pour jamais écrit
lvalue == false
OriginalL'auteur akbiggs | 2009-09-20
Vous devez vous connecter pour publier un commentaire.
Noter la différence entre
done = false
etdone == false
. Le premier attribuedone
êtrefalse
et évalue commefalse
, le second comparedone
avecfalse
et est exactement identique à!done
.Donc si vous l'utilisez:
Puis
done
est fixé àfalse
et le code dans la boucle while ne fonctionne pas du tout.err, pas de point d'exclamation; signe égal. LOL.
si vous sortez de la (MAUVAISE) habitude de explicitement la comparaison des valeurs booléennes avec"==", vous ne ferez pas cette erreur.
OriginalL'auteur Joren
La déclaration
x = false
est une mission - vous êtes la configuration de x pour faux. Les déclarationsx == false
et!x
sont cependant les mêmes. La déclarationx == false
compare x pour faux et sera true si la valeur dex
est faux et faux si la valeur dex
est vrai. La déclaration!x
sera le résultat de la négation de la valeur dex
.Dans votre code, si vous remplacez
while (!inputDone)
avecwhile(inputDone == false)
, vous permettra d'obtenir le comportement attendu.OriginalL'auteur Thomas Owens
Vous devez utiliser
==
au lieu de=
pour les comparaisons.OriginalL'auteur João Silva
"while(done = false)" est égale à "done=false; while(terminé)"
Il devrait être écrit "while(done == false)" ou "while(false == terminé)".
Mais encore , !fait est le plus lisible le code, il dit "ne PAS FAIRE"
while (!done) {
.l'écriture de "while (done == false) ..." qui fonctionne le mieux pour moi. J'ai tendance à négliger ces satanés points d'exclamation.
OriginalL'auteur Dennis C
Comme beaucoup d'autres l'ont souligné, vous avez typoed
==
. Plus intéressantes sont les questions qui entourent cette.De langage conçu: Encourager les effets secondaires des expressions est mauvais. En utilisant le symbole
==
pour représenter les mathématiques=
n'est pas un bon choix.En termes de lisibilité,
!done
lit beaucoup mieux quedone == false
- nous voulons "pas fait" (mieux, de l'OMI, serait "jusqu'à ce que fait" au lieu de "tout n'est pas réalisé"). Bien que (perpétuel) débutants écris souvent redondantssomeCondition == true
.C'est une bonne idée de faire des variables
final
, bien que clairement pas possible dans cette situation. Cependant, on peut retirer le drapeau entièrement à l'aide d'une instruction break. Une minorité suit une Seule Entrée, de Sortie Unique (SESE) de la règle, en vertu de laquellebreak
est interdit, ce qui ferait de cet exemple plus compliqué (vous auriez besoin d'un test pour voir si le texte était valideint
, ou dans ce cas, déplacer le corps dans la boucle.OriginalL'auteur Tom Hawtin - tackline
L'expression:
signifie attribuer
x
la valeurfalse
.Après ce qui se passe dans votre
while()
, il évalue alorsx
, qui estfalse
afin de ne pas entrer dans la boucle.D'autre part:
signifie "aussi longtemps que !x est vrai, continuer la saisie de la boucle". depuis
!x
signifie "à l'opposé de x". Donc, tant quex
est fausse, la boucle seraOriginalL'auteur Mike
D'autres réponses ont fait allusion au fait que l'écriture
x == false
etx == true
sont de mauvais style. Il y a trois raisons à cela:x
quex == true
, ou!x
quex == false
.x
plutôt quex == true
, et!x
plutôt quex == false
.y
n'est pas un Booléen, une faute de frappe de la formeif (y = foo) {
donnera une erreur de compilation en Java. Mais siy
est un Booléen alorsif (y = foo) {
ne donne pas une erreur de compilation. Par conséquent, en évitant==
pour les Booléens vous éviter de vous-même la mise en place de toute une série de bugs résultant de fautes de frappe.OriginalL'auteur Stephen C
Beaucoup l'ont déjà souligné d'une mauvaise utilisation de
=
vs==
. Je tiens à souligner que l'exécution d'une analyse de code statique outil comme Findbugs aurait trouvé cela pour vous.Voir QBA: Méthode attribue boolean littérales d'expressions booléennes
OriginalL'auteur Jeff Olson