359 votes

Pourquoi (0 < 5 < 3) renvoie-t-il vrai ?

Je me suis amusé avec jsfiddle.net et je suis curieux de savoir pourquoi cette réponse est vraie ?

if(0 < 5 < 3) {
    alert("True");
}

Tout comme ceci :

if(0 < 5 < 2) {
    alert("True");
}

Mais ce n'est pas le cas :

if(0 < 5 < 1) {
    alert("True");
}

Cette bizarrerie est-elle jamais utile ?

14 votes

Est-ce que tu sais wtfjs.com ?

1 votes

Ha ! Non, je n'avais jamais vu ça avant.

0 votes

Ah, les joies des conversions implicites de types.

453voto

Alan Geleynse Points 11842

Ordre des causes des opérations (0 < 5 < 3) pour être interprété en javascript comme ((0 < 5) < 3) qui produit (true < 3) et vrai est compté comme 1, ce qui fait qu'il renvoie vrai.

C'est aussi pourquoi (0 < 5 < 1) retourne faux, (0 < 5) retourne vrai, ce qui est interprété comme 1 ce qui donne (1 < 1) .

161 votes

Et parce que JavaScript n'est PAS Python :-)

1 votes

Vous avez répondu alors que j'étais en train de modifier ma question pour ajouter la if(0 < 5 < 1) == false . Tout est clair maintenant, merci :)

28 votes

Exactement, Python est le seul langage que je connaisse qui traite cette syntaxe comme ((0 < 5) && (5 < 3)) Il y en a probablement d'autres, mais je ne les connais pas.

64voto

CaffGeek Points 10925

Je pense que c'est parce que 0 < 5 est vrai, et true < 3 se transforme en 1 < 3 ce qui est vrai.

7 votes

Il n'y a pas de casting ici. Un casting est un opérateur, que le programmeur utilise pour explicitement vérifier un type. C'est implicite conversion d'un booléen en un nombre entier.

4 votes

@erickson, vraiment... avons-nous besoin de nous accrocher à la sémantique ici ?

2 votes

Ne t'inquiète pas pour Erikson. J'utilise aussi mal le mot sémantique :)

22voto

Jack Points 61503

Probablement parce que true est supposé être 1 donc

0 < 5 < 3  -->  true < 3 -->  1 < 3  --> true

18voto

Harmen Points 11632

Parce que true < 3 parce que true == 1

11voto

Zach Johnson Points 12062

Quant à votre question de savoir si cette bizarrerie est jamais utile : Je suppose qu'il pourrait y avoir des cas où elle serait utile (si un code condensé est ce que vous recherchez), mais s'y fier réduira (très probablement) sévèrement la compréhensibilité de votre code.

C'est un peu comme utiliser l'incrémentation/décrémentation post/pre dans le cadre d'expressions plus importantes. Pouvez-vous déterminer d'un coup d'œil le résultat de ce code ?

int x = 5;
int result = ++x + x++ + --x;

Remarque : avec ce code, vous pouvez parfois même obtenir des résultats différents selon le langage et le compilateur.

C'est une bonne idée de faciliter votre vie et celle de votre prochain qui liront votre code. Écrivez clairement ce que vous voulez vraiment qu'il se passe plutôt que de vous fier à des effets secondaires comme la conversion implicite des booléens.

0 votes

Par curiosité, est-ce que result 18 ?

6 votes

@MrMisterMan : Je ne suis pas certain pour Javascript, mais en Java et C# l'évaluation est garantie de gauche à droite, et le résultat est bien 18. Dans certains langages, tels que C et C++, il n'est pas garanti que l'évaluation se fera de gauche à droite, et vous pouvez obtenir des résultats différents en fonction des optimisations ajoutées par votre compilateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X