en JavaScript, l'opérateur est le même vrai chez PHP? Pouvez-vous donner un exemple? P> p> == code> n'est pas nécessairement transitif:
3 Réponses :
non fort>, le Le même scénario donne le même résultat en PHP. P> == code> n'est pas transitif.
boolean true
boolean true
boolean false
Ouais. La raison en est que le bon opérande est typée du type de données de l'opérande gauche. 0 code> tycast à une chaîne devient
'0' code>,
'' ' code> tycast à un int devient
0 code>, mais
'' code> est déjà une chaîne, il est donc directement comparé au
'0' code> et trouvé non égal. Bien que les raisons exactes de JavaScript soient un peu différentes.
-1 Pourquoi répondez-vous à votre propre question? (Si vous saviez la réponse, pourquoi le demander?) Aucune infraction, mais avec un représentant> 10k, vous devriez vraiment savoir mieux et «montrer et dire» les questions ne sont pas vraiment acceptables.
@MidDAparka: meta. stackexchange.com/questions/12513/... Je n'essaie pas de agrandir le représentant. Je ne connaissais pas la réponse avant i> poser la question, juste très peu de temps après avoir décidé de le tester réellement. Et juste parce que i i> a facilement compris la réponse, cela ne signifie pas que tout le monde est au courant de ce problème de transitivité. Qu'est-ce qui est si affreux de l'éducation de la communauté et de les sauver de devoir exécuter ce code?
@Gordon: Non. C'est une réponse. J'espérais que d'autres personnes posteraient également d'autres exemples.
@keithJgrant: Mais dans '01 '==' 1 '<1' code> Les deux i> Les opérandes sont convertis en INTS, même s'ils sont déjà du même type. Donc, dans
'0' == '' ' code>,
' 0 ' code> reste une chaîne car l'autre opérande ne peut pas être converti en Int aussi?
@Mark excuses. (J'ai enlevé mon bowvote - a dû "modifier" votre question, mais n'a fait aucune modification.) Toutefois, pour une question qui est si triviale à répondre (cela vous a pris toutes deux minutes), il se sent toujours un peu bon marché.
@MiddAparka: Comme je l'ai dit, je ne me soucie pas vraiment du représentant. Je ne savais pas cela avant de la poster, alors peut-être que quelqu'un d'autre apprendra aussi quelque chose, même s'il est trivial de comprendre vous-même, ce n'est pas quelque chose que vous attendez habituellement.
La réponse est donc non, l'opérateur == n'est pas transitif dans PHP?
@Mark: La typée est l'un des aspects les plus importants de PHP (et JavaScript). Vous devriez toujours i> en soyez conscient.
@Roger: correct. J'aurais dû inclus ça. J'aime les réponses qui l'orthographique, même si cela est impliqué dans le paragraphe. @WebBiiedave: Ouais ... pour '0' == 0 code> C'est simple, mais lorsque vous ajoutez une 3ème variable, c'est moins évident. La conversion n'est pas interprétée de la même manière. En général, si un == B == C, vous vous attendez à un == c.
@ @mark: intéressant. Tu as raison. Ce genre de chose est exactement pourquoi j'utilise l'opérateur === code> pour la comparaison dans PHP, dans la mesure du possible.
Notez que non plus << / code>,
<= code>,
> code> et
> = code> transitif. Par exemple:
0 <'1' code> et
'1' <'A' code> est à la fois true, mais
0 <'A' code> est faux.
La même chose est vraie dans PHP:
//php '0'==0 //true 0=='' //true ''=='0' //false
Oui je l'ai fait. Une seconde après l'avoir posté. Voir ma réponse. Était une spin-off de cette question: Stackoverflow .Com / Questions / 4752579 / ... lui a demandé une exhaustivité et de faire autant d'autres soi-disants ... ce n'est pas vraiment intuitif.
@ @Mark: cool. + 1'd votre réponse, il n'y a rien de mal à faire ça.
true == 1 // true true == 2 // true 1 == 2 // false
0 == null code> évalue vers
vrai code> pour moi.
Ah, mon erreur, j'ai testé avec === code> pour le dernier sans en rendre compte. Voici un alternatif
"Sonne à dire que ces opérateurs ne seraient pas transitifs" - seulement si vous inclinez votre tête et regardez-la de manière étrange. Aucun de vos exemples n'a de sens pour moi; Je pense qu'ils devraient retourner null code> à la place ou erreur. Dans votre dernière phrase, voulez-vous dire si
a == b code> implique
b == a code>? Mais si PHP peut casser d'autres lois de la logique, cela ne me surprendrait vraiment pas si cela n'était pas toujours vrai non plus.
Je pense que le problème ici est que cela s'appelle "égalité" quand cela signifie vraiment quelque chose de plus comme "est un peu similaire à". Ensuite, si un "un peu similaire" à b, et b est "un peu similaire" à c, il fait pas i> suive que A est "un peu similaire" à c (si cela ne répond pas au seuil pour la similitude).
Eh bien, oui ... c'est exactement ça, == code> signifie totalement "est un peu similaire à". C'est parce que c'est une langue de script - ces «égalités» sont là pour plus de commodité. PHP au moins vous fournit
=== code> pour une égalité stricte. et non, je n'ai pas voulu dire
a == b code> =>
b == A code>, c'est la symétrie, pas la réflexivité. Dans d'autres langages de script, l'opérateur
== code> utilise simplement la méthode .equals (), ce qui signifie que vous pouvez faire ce que vous voulez dire ce que vous voulez. Pour référence: Stackoverflow.com/ Questions / 10185879 / ...
Ouais ... j'aime mieux cet exemple. Je suppose que a == A code> semble trop évident pour mentionner jusqu'à ce que vous envisagiez de surcharger l'opérateur.
Oui, je l'ai généralement mentionné parce que vous avez mentionné une réflexivité dans votre autre question.
se2.php.net/manual/fr/language.operators.carson. php
Les mêmes échantillons peuvent être exécutés dans le PHP avec les mêmes résultats.
@zerkms: tous eux? Cordes, et Ints, et tout ce que l'étrangeté donne le même résultat? Pas seulement celui-ci?
Dupliqué possible de Tous les comparaisons d'égalité PHP réflexive?
Euh .. Désolé ... voté pour fermer depuis qu'il me semblait en double question de votre question précédente, mais celle-ci était une réflexivité de l'opérateur.
@MCHL: Ouais ... J'ai spécifiquement demandé à cette question parce que I> Je pense que c'est là que l'étrangeté se produit, pas avec une réflexivité.