8
votes

Pourquoi Java nécessite-t-il un signe de double équivalence?

Pourquoi Java nécessite-t-il un signe double équivalence (==) lors de la comparaison d'entiers dans un si code> instruction?

Par exemple P>

if(x == 3.141)
     System.out.println("x is equal to pi.");


0 commentaires

8 Réponses :


10
votes

ne serait-ce pas déroutant si = est parfois affectant, et parfois comparaison, selon le contexte que vous avez utilisé?

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.

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)?

Il est assez courant dans pendant boucles: xxx


3 commentaires

Pouvez-vous l'int. une variable dans une déclaration si?


FAIT FUN: VB (et VB.NET) Surcharge = pour l'affectation et l'égalité. [VB] a = b = c == [Java] a = b == c; (non [Java] a = b = c; ).


@ michaelb958: Mais ils n'ont pas == du tout, non? C'est donc cohérent aussi.



1
votes

Notez quel message d'erreur vous obtenez pour si (x = 3.141) ; C'est une erreur de type (ne peut pas convertir de double sur booléen ).

Le type de l'affectation est le type de ses deux côtés; Si le type de l'affectation est booléen ( si (x = true) ou même si (x = a.equaux (b)) ), alors il est légal de écrire.

Donc, comme il est légal d'affecter une valeur à un booléen dans la condition, vous devez utiliser == pour comparaison.


2 commentaires

Si le type de l'affectation est booléen (si (x = true)), il est légal d'écrire. 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.



1
votes

est-il même autorisé à assigner une valeur variable une valeur dans une instruction IF (ou initier une nouvelle variable)?

oui. Un idiome commun pour faire c'est: xxx

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.


3 commentaires

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 = pour se comporter différemment non seulement dans les conditionnels et les relevés, mais aussi différemment pour les conditions de pendant et si si si



0
votes

Vous pouvez absolument attribuer une variable dans une instruction IF. En outre, c'est comme ça que ça marche: = est toujours affectation, et == est toujours comparateur.


0 commentaires

2
votes
== 

2 commentaires

Initialiser une nouvelle variable n'est pas autorisée, IIRC. Qui n'est autorisé que dans pour


L'initialisation @NhahTDH n'est pas autorisée. L'affectation est.



1
votes

Historique des langages de programmation 101:

  • FORTRAN utilise = pour les deux.
  • algol introduit : = pour l'affectation et l'utilisation = à comparaison. Ceci était tenu de résoudre une ambiguïté de la grammaire.
  • Pascal suivi Costume.
  • PL / 1 n'a pas.
  • Je ne peux pas parler pour B ou BCPL, mais au moment où nous avons eu C, il était = pour affectation et == pour la comparaison, à nouveau pour résoudre une ambiguïté de la grammaire
  • C ++ suivi C
  • Java a suivi C ++ à de nombreux égards, y compris celui-ci.

    L'ambiguïté de la grammaire se pose à cause de l'autorisation d'affectations dans des expressions. Contrairement à votre assertion, si (x = true) est légal dans Java si x est de type booléen . . .


0 commentaires

1
votes

== 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>

Les choses peuvent transformer votre buggy lors de l'utilisation de votre exemple avec des booléens: p> xxx pré>

tandis que d'autres types gagnés Il compile avec cette syntaxe, boolean code> et booléen code> DO, c'est pourquoi le motif suivant est conseillé: P>

if (b)


0 commentaires

0
votes

alors ..

= code> est affectation, et == code> est une comparaison, et c'est toujours comme ça, peu importe où ils sont utilisés. P >

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 boolean a = false code> dans le () code> de si instruction, mais vous pouvez écrire a = faux code> quand a été déclaré avant. P>

Toutes les affectations sont légales. Par exemple: p> xxx pré>

Ce n'est pas légal, car string.indexof (string) code> retourne un int, tandis que si code> nécessite Un booléen. P>

En outre, il y a une énorme différence entre "strict>" légal " strong> et " sens " p> xxx

C'est légal, comme ! = 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>

Cependant, p>

int index;
boolean flag;
if ( flag = ((index = str.indexOf("something")) != -1) ) {
    ...
}


1 commentaires

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».