359 Stimmen

Warum liefert (0 < 5 < 3) true?

Ich spielte herum in jsfiddle.net und ich bin neugierig, warum dies wahr zurückgibt?

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

Das gilt auch hier:

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

Dies ist jedoch nicht der Fall:

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

Ist diese Eigenart überhaupt nützlich?

9voto

PAUL Mansour Punkte 121

Die Antwort auf den zweiten Teil der Frage, "ist diese Eigenart jemals nützlich?", ist vielleicht nein, wie in einer früheren Antwort angemerkt, wenn es tatsächlich eine Eigenart der Sprache (Javascript) ist, dass true in 1 umgewandelt wird, aber dass der Programmierer im Allgemeinen 1 und true (und 0 und false) nicht als das Gleiche ansieht.

Wenn Sie jedoch ein mentales Modell haben, bei dem 1 wahr und 0 falsch ist, dann führt dies zu allen möglichen netten booleschen Techniken, die extrem nützlich, mächtig und direkt sind. So könnte man zum Beispiel einen Zähler direkt mit dem Ergebnis A > 100 inkrementieren, was den Zähler erhöhen würde, wenn A größer als 100 ist. Diese Technik könnte in Java als eine Eigenart oder ein Trick angesehen werden, aber in einer Array- oder funktionalen Sprache kann sie idiomatisch sein.

Ein klassisches Beispiel in der Array-Sprache APL wäre es, die Anzahl der Elemente in einem Array zu zählen, die (sagen wir) größer als 100 sind:

+/A>100

Wenn A das 5-Elemente-Array 107 22 256 110 3 ist, dann:

A>100

ergibt das 5 Elemente umfassende boolesche Array:

1 0 1 1 0

und summieren dieses boolesche Ergebnis:

+/1 0 1 1 0

ergibt die endgültige Antwort:

3

Diese Frage ist ein perfektes Beispiel dafür, dass diese Technik sehr nützlich ist, vor allem, wenn das Problem verallgemeinert wird, um zu bestimmen, ob n von m booleschen Werten wahr sind.

Prüfen, ob mindestens zwei von drei Booleschen Werten wahr sind

7voto

netrox Punkte 5143

Das ist ganz einfach.

(0 < 5 < 3)

Beginnen Sie mit links nach rechts, so dass die erste 0 < 5 ausgewertet wird. Stimmt das? Ja. Da TRUE=1 ist, wird 1 < 3 ausgewertet. Da 1 kleiner als 3 ist, ist es wahr.

Jetzt mit diesem

 (0 < 5 < 1)

Ist 0 kleiner als 5? Ja. Also mach es TRUE, was auch 1 bedeutet. Mit dieser Tatsache im Hinterkopf ergibt sich die Auswertung (1 < 1). Ist 1 kleiner als 1? Nein, also ist es falsch. Es muss gleich sein.

4voto

David Punkte 41

Wird 0<5 ausgewertet, was 1 für wahr zurückgeben würde, wenn 1<3 wahr ist?

In C# ist dies nicht möglich: "Der Operator '<' kann nicht auf Operanden des Typs 'bool' und 'int' angewendet werden".

4voto

Hippocrates Punkte 2500

Ich bin vor einiger Zeit in Obj-C auf dieses Problem gestoßen und war sehr verwirrt darüber. Ich habe die gewünschten Ergebnisse erhalten, indem ich etwas wie folgt gemacht habe:

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

Was natürlich falsch ist, so dass man den "wahren" Alarm nicht bekommt. Gut, dass ich das gelesen habe, jetzt weiß ich, warum.

4voto

Hippocrates Punkte 2500

Neben Python ist CoffeeScript eine weitere Sprache, die verkettete Vergleiche unterstützt, also 3 < x < 10 würde umgewandelt werden in (3 < x && x < 10) in Vanille JS

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X