Je jouais dans jsfiddle.net et je suis curieux de savoir pourquoi cela redevient vrai?
if(0 < 5 < 3) {
alert("True");
}
Ainsi fait ceci:
if(0 < 5 < 2) {
alert("True");
}
Mais cela ne veut pas:
if(0 < 5 < 1) {
alert("True");
}
Est-ce que cette bizarrerie est utile?
L’ordre des opérations entraîne l’interprétation de (0 < 5 < 3)
en javascript en tant que ((0 < 5) < 3)
, ce qui produit (true < 3)
et true est compté à 1, ce qui l’a renvoyé à true.
C'est aussi pourquoi (0 < 5 < 1)
renvoie false, (0 < 5)
renvoie true, ce qui est interprété en tant que 1
, résultant en (1 < 1)
.
Mon hypothèse est que 0 < 5
est vrai et que true < 3
est converti en 1 < 3
qui est vrai.
probablement parce que true
est supposé être 1
donc
0 < 5 < 3 --> true < 3 --> 1 < 3 --> true
Parce que true < 3
, parce que true == 1
En ce qui concerne votre question sur le point de savoir si cette bizarrerie est toujours utile: je suppose qu’il pourrait y avoir un cas où cela serait utile (si le code condensé est ce que vous recherchez), mais son utilisation réduira (très probablement) fortement la compréhensibilité de votre code.
C'est un peu comme si vous utilisiez post/pre increment/décrément dans le cadre d'expressions plus grandes. Pouvez-vous déterminer quel est le résultat de ce code en un coup d'œil?
int x = 5;
int result = ++x + x++ + --x;
Remarque: avec ce code, vous pouvez parfois obtenir des résultats différents en fonction du langage et du compilateur.
C'est une bonne idée de vous faciliter la vie, ainsi que celle du prochain type qui lira votre code. Ecrivez clairement ce que vous voulez réellement faire plutôt que de vous fier à des effets secondaires tels que la conversion implicite de booléens.
La réponse à la deuxième partie de la question, "cette bizarrerie est-elle utile?" est peut-être non, comme indiqué dans une réponse précédente, s'il s'agit bien d'une bizarrerie du langage (Javascript) selon lequel true est jeté sur 1, mais que le programmeur n'a pas en général la vue 1 et vrai (et 0 et faux) comme même chose.
Si toutefois vous avez un modèle mental de 1 vrai et de 0 faux, cela conduit à toutes sortes de techniques booléennes de Nice extrêmement utiles, puissantes et directes. Par exemple, vous pouvez incrémenter directement un compteur avec le résultat de A> 100, ce qui incrémenterait le compteur si A est supérieur à 100. Cette technique peut être considérée comme une erreur ou un truc en Java, mais dans un tableau ou un langage fonctionnel peut être idiomatique.
Un exemple classique dans le langage de tableau APL serait de compter le nombre d'éléments d'un tableau qui sont (par exemple) supérieurs à 100:
+/A>100
Où si A est le tableau de 5 éléments 107 22 256 110 3 alors:
A>100
donne le tableau booléen à 5 éléments:
1 0 1 1 0
et en résumant ce résultat booléen:
+/1 0 1 1 0
donne la réponse finale:
3
Cette question est un exemple parfait de l'endroit où cette technique serait très utile, en particulier si le problème est généralisé pour déterminer si n sur m valeurs booléennes sont vraies.
C'est facile.
(0 < 5 < 3)
Commencez de gauche à droite pour évaluer le premier 0 <5. Est-ce vrai? Oui. Puisque TRUE = 1, il évalue 1 <3. Puisque 1 est inférieur à 3, c'est donc vrai.
Maintenant avec ça
(0 < 5 < 1)
Est-ce que 0 est inférieur à 5? Oui. Faites donc VRAI ce qui signifie également 1. Maintenant, gardez ce fait à l’esprit, le résultat est égal à (1 <1). Est-ce que 1 est inférieur à 1? Non, donc c'est faux. Il faut que ce soit égal.
évalue-t-il 0 <5 qui rendrait 1 pour vrai quand 1 <3 qui est vrai?
C # veut vous permettre de faire ceci "L'opérateur '<' ne peut pas être appliqué aux opérandes de type 'bool' et 'int'"
Je suis tombé sur cela il y a un moment à Obj-C et cela m'a beaucoup intriguée. J'ai obtenu les résultats souhaités en faisant quelque chose comme ceci:
if(0 < 5 && 5 < 3) {
alert("True");}
Ce qui bien sûr est faux pour ne pas avoir cette alerte "vraie" ... Je suis content d'avoir lu cela, je sais maintenant pourquoi.
Outre Python, CoffeeScript est un autre langage qui prend en charge les comparaisons chaînées. Ainsi, 3 < x < 10
serait converti en (3 < x && x < 10)
dans Vanilla JS
0 < 5 < 3
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true
Un opérande booléen, lorsqu'il est utilisé avec un opérateur mathématique, retourne un nombre ..__ pour le vérifier
true + 1 which gives you 2.
Donc, 0 < 5
, le booléen renvoyé (vrai) utilisé avec l'opérateur mathématique (<) renverra un nombre. Donc, il se résume à 1 <3, ce qui retourne true
parce que 0 est inférieur à 5, cela retourne vrai et, par défaut, vrai est tout ce qui est compris et peut être évalué à 1, ce qui est toujours inférieur à 3, ce qui retourne à nouveau vrai.