punkrockbuddyholly
punkrockbuddyholly

Reputation: 9794

Why does (0 < 5 < 3) return true?

I was playing around in jsfiddle.net and I'm curious as to why this returns true?

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

So does this:

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

But this doesn't:

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

Is this quirk ever useful?

Upvotes: 358

Views: 14062

Answers (16)

Hazem Saber
Hazem Saber

Reputation: 1

true == 1 and false ==0 so let's take one of your examples and start

from left to right :

(0 < 5 < 3 ) ------>(true < 3 )[ true ==1 ]----->( 1 < 3 ) -----> true

another example

(20 < 1 < 1 ) ------>(false < 1) [false ==0]----->(0 < 1 ) ------> true

Upvotes: -1

CodeMaven42
CodeMaven42

Reputation: 44

I also faced the same thing.

code:

// Case 1
console.log(1 < 2 < 3); // true
// Case 2
console.log(3 > 2 > 1); // false

In JavaScript, both Case 1 and Case 2 involve chaining comparison operators, and the behavior might seem counterintuitive due to how JavaScript handles them based on operator precedence and associativity.

  1. Case 1: console.log(1 < 2 < 3); // true

    • This evaluates as (1 < 2) < 3.
    • Firstly, 1 < 2 is true (true in JavaScript can be implicitly converted to 1 in numeric comparisons).
    • Then, true when compared to 3 is coerced into numeric values, resulting in 1 < 3, which is true.
    • Thus, the final output is true.
  2. Case 2: console.log(3 > 2 > 1); // false

    • This evaluates as (3 > 2) > 1.
    • Firstly, 3 > 2 is true (true).
    • Then, true when compared to 1 is coerced into numeric values, resulting in 1 > 1, which is false.
    • Therefore, the final output is false.

This behavior can be confusing due to JavaScript's implicit type coercion and left-to-right associativity of comparison operators, which can lead to unexpected results when chaining these operations together.

Upvotes: 0

SwiftNinjaPro
SwiftNinjaPro

Reputation: 853

try phrasing your results as Number()

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

or try this:

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

I googled this because I was getting (3 >= 20) //returning true and I guess javascript was trying to check 3 as a boolean because I was getting this value from the elm.getAttribute(); function which console.log(); was printing in String form.

Upvotes: -1

ndotie
ndotie

Reputation: 2150

because 0 is less then 5 then that returns true, and by default true is anything including and can be evaluated to 1 which is still less than 3 which again returns true

Upvotes: 1

truease.com
truease.com

Reputation: 1301

0 < 5 < 3 
==> ( ( 0 < 5 ) < 3 )
==> true < 3
==> 1 < 3
==> true

Upvotes: 3

Hippocrates
Hippocrates

Reputation: 2540

In addition to python, CoffeeScript is another language that supports chained comparisons, thus 3 < x < 10 would be converted to (3 < x && x < 10) in vanilla JS

Upvotes: 4

Rajkamal Subramanian
Rajkamal Subramanian

Reputation: 6944

A boolean operand when operated over a math operator returns a number. to check this we do

true + 1  which gives you 2.

So 0 < 5, the returned boolean(true) operated with math operator(<) will return a number. So it boils to 1<3 which returns true

Upvotes: 1

PAUL Mansour
PAUL Mansour

Reputation: 131

The answer to the second part of the question, "is this quirk ever useful?" is perhaps no, as noted by a previous answer, if it is indeed a quirk of the language (Javascript) that true is cast to 1, but that the programmer does not in general view 1 and true (and 0 and false) as the same thing.

If however you have a mental model of 1 being true and 0 being false, then it leads to all sorts of nice boolean techniques that are extremely useful, powerful, and direct. For example, you could increment a counter directly with the result of A > 100, which would increment the counter if A is greater than 100. This technique might be viewed as a quirk or a trick in Java, but in an array or functional language may be idiomatic.

A classic example in the array language APL would be to count the number of items in an array that are (say) greater than 100:

+/A>100

Where if A is the 5 item array 107 22 256 110 3 then:

A>100

yields the 5 item boolean array:

1 0 1 1 0

and summing this boolean result:

+/1 0 1 1 0

yields the final answer:

3

This question is a perfect example of where this technique would be very useful, especially if the problem is generalized to determine if n out of m boolean values are true.

Check if at least two out of three booleans are true

Upvotes: 9

netrox
netrox

Reputation: 5326

That's easy.

(0 < 5 < 3)

Start with left to right so it evaluates the first 0 < 5. Is it true? Yes. Since TRUE=1, it evaluates 1 < 3. Since 1 is less than 3 so it's true.

Now with this

 (0 < 5 < 1)

Is 0 less than 5? Yes. So make it TRUE which also means 1. Now with that fact in mind, it evaluates to (1 < 1). Is 1 less than 1? No, therefore it's false. It has to be equal.

Upvotes: 7

Hippocrates
Hippocrates

Reputation: 2540

I ran into this a little while ago in Obj-C and was very puzzled by it. I got the results I wanted by doing something like this:

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

Which of course is false so you wouldn't get that "true" alert. Glad I read this, I now know why.

Upvotes: 3

Zach Johnson
Zach Johnson

Reputation: 24232

As to your question whether this quirk is ever useful: I suppose there could be some case where it would useful (if condensed code is what you are after), but relying on it will (most likely) severely reduce the understandability of your code.

It's kind of like using post/pre increment/decrement as a part of bigger expressions. Can you determine what this code's result is at a glance?

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

Note: with this code, you can sometimes even get different results depending on the language and compiler.

It's a good idea to make life easy for yourself and the next guy who will read your code. Clearly write out what you actually want to have happen rather then relying on side effects like the implicit conversion of booleans.

Upvotes: 11

Alan Geleynse
Alan Geleynse

Reputation: 25139

Order of operations causes (0 < 5 < 3) to be interpreted in javascript as ((0 < 5) < 3) which produces (true < 3) and true is counted as 1, causing it to return true.

This is also why (0 < 5 < 1) returns false, (0 < 5) returns true, which is interpreted as 1, resulting in (1 < 1).

Upvotes: 453

David
David

Reputation: 41

is it evaluating 0<5 which would return 1 for true when 1<3 which is true?

C# want let you do this "Operator '<' cannot be applied to operands of type 'bool' and 'int'"

Upvotes: 4

Jack
Jack

Reputation: 133587

probably because true is assumed as 1 so

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

Upvotes: 22

Harmen
Harmen

Reputation: 22438

Because true < 3, because true == 1

Upvotes: 18

CaffGeek
CaffGeek

Reputation: 22054

My guess is because 0 < 5 is true, and true < 3 gets cast to 1 < 3 which is true.

Upvotes: 64

Related Questions