Pourquoi Java nécessite-t-il un signe double équivalence (==) lors de la comparaison d'entiers dans un Par exemple P> si code> instruction? if(x == 3.141)
System.out.println("x is equal to pi.");
8 Réponses :
ne serait-ce pas déroutant si Cela ressemble à une mauvaise idée et introduisait des erreurs. < / p> plus, la syntaxe actuelle est compatible avec C et C ++, de sorte que beaucoup de gens connaissent bien. P> Y a-t-il une raison quelconque qui voudrait jamais assigner une variable une nouvelle valeur à l'intérieur d'une instruction IF (si oui, veuillez fournir un exemple)? P>
blockQuote> Il est assez courant dans = code> est parfois affectant, et parfois comparaison, selon le contexte que vous avez utilisé?
pendant code> boucles: p>
Pouvez-vous l'int. une variable dans une déclaration si?
FAIT FUN: VB (et VB.NET) Surcharge = CODE> pour l'affectation et l'égalité. [VB] a = b = c code> == [Java] a = b == c; code> (non [Java] a = b = c; code>).
@ michaelb958: Mais ils n'ont pas == code> du tout, non? C'est donc cohérent aussi.
Notez quel message d'erreur vous obtenez pour Le type de l'affectation est le type de ses deux côtés; Si le type de l'affectation est booléen ( Donc, comme il est légal d'affecter une valeur à un si (x = 3.141) code>; C'est une erreur de type forte> (ne peut pas convertir de double code> sur booléen code>). p>
si (x = true) code> ou même si (x = a.equaux (b)) code>), alors il est légal de écrire. p>
booléen code> dans la condition, vous devez utiliser == code> pour comparaison. P>
Si le type de l'affectation est booléen (si (x = true)), il est légal d'écrire. code> pendant que cela est correct, il est probablement une erreur. Pourquoi veut-on citer, puis tester tout de suite?
@nhahtdh a changé mon exemple. Je suis d'accord c'est un style mauvais, cependant.
est-il même autorisé à assigner une valeur variable une valeur dans une instruction IF (ou initier une nouvelle variable)? P>
oui. Un idiome commun pour faire c'est: p>
xxx pré> dans la boucle, la ligne est attribuée une valeur puis comparée à NULL. Je ne peux pas penser à un exemple avec Ints; Cela ne serait certainement pas clair là-bas. P> blockquote>
et dans une déclaration de si? Je ne peux pas se mettre et la variable = à une autre ou int. une variable sans erreur d'erreur
@java: Vous ne définissez pas simplement la variable. Si vous souhaitez définir un tas de variable, vous pouvez le faire avant la boucle. À moins que vous ne puissiez incorporer l'affectation dans une comparaison, comme dans l'exemple, vous ne pourrez pas faire d'affectation dans l'état de tout. Cela dit, ne vous forcez pas à écrire une telle chose si cela n'est pas naturel et déroutant.
Donc, vous voulez = code> pour se comporter différemment non seulement dans les conditionnels et les relevés, mais aussi différemment pour les conditions de pendant code> et si code> si code> si
Vous pouvez absolument attribuer une variable dans une instruction IF. En outre, c'est comme ça que ça marche: = code> est toujours affectation, et == code> est toujours comparateur. P>
==
Initialiser une nouvelle variable n'est pas autorisée, IIRC. Qui n'est autorisé que dans pour code>
L'initialisation @NhahTDH n'est pas autorisée. L'affectation est.
Historique des langages de programmation 101: P>
= code> pour les deux. li>
- algol introduit
: = code> pour l'affectation et l'utilisation = code> à comparaison. Ceci était tenu de résoudre une ambiguïté de la grammaire. LI>
- Pascal suivi Costume. Li>
- PL / 1 n'a pas. LI>
- Je ne peux pas parler pour B ou BCPL, mais au moment où nous avons eu C, il était
= code> pour affectation et == code> pour la comparaison, à nouveau pour résoudre une ambiguïté de la grammaire li>
- C ++ suivi C LI>
- Java a suivi C ++ à de nombreux égards, y compris celui-ci. Li>
ul>
L'ambiguïté de la grammaire se pose à cause de l'autorisation d'affectations dans des expressions. Contrairement à votre assertion, si (x = true) code> est légal dans Java si x code> est de type booléen em>. P>. P>.
Les choses peuvent transformer votre buggy lors de l'utilisation de votre exemple avec des booléens: p> tandis que d'autres types gagnés Il compile avec cette syntaxe, == code> est le comparateur d'identité, qui fonctionne pour les objets et les primitives. Il répond à la question "Les deux choses sont les deux choses la même chose em> chose". = code> est l'opérateur d'affectation. Il définit la valeur du côté gauche sur le côté droit. P> boolean code> et booléen code> DO, c'est pourquoi le motif suivant est conseillé: P> if (b)
alors ..
et l'affectation est différente avec "Déclaration". Une déclaration d'affectation a sa valeur de retour, tandis qu'une déclaration ne le fait pas. Donc, vous ne pouvez pas écrire Toutes les affectations sont légales. Par exemple: p> Ce n'est pas légal, car En outre, il y a une énorme différence entre "strict>" légal " strong> et " sens " p> C'est légal, comme Cependant, p> = code> est affectation, et == code> est une comparaison, et c'est toujours comme ça, peu importe où ils sont utilisés. P > boolean a = false code> dans le () code> de si instruction, mais vous pouvez écrire a = faux code> quand a été déclaré avant. P> string.indexof (string) code> retourne un int, tandis que si code> nécessite Un booléen. P> ! = code> L'opération renvoie un booléen, et c'est logique, comme je souhaite vérifier si le STR contient une sous-chaîne "quelque chose"; P> int index;
boolean flag;
if ( flag = ((index = str.indexOf("something")) != -1) ) {
...
}
La raison pour laquelle vous ne pouvez pas utiliser une déclaration dans une condition est que la syntaxe ne le permet pas, non pas parce que «une déclaration n'a pas de valeur de retour».