Explaining the result of an arithmetic expression in JavaScript
I misunderstand why the following code outputs -1 in console.
x = 42;
x = (x == 42) * -1 + (x != 42) * x;
-1
Due to Type Coercion, the comparison of x to 42 yields true
and is thus translated to 1
.
So 1 * -1
yields -1
.
Now, (x != 42)
which is false
yields 0
so I have expected to get in console
-42
Because -1 + 0 * 42 MEANS -42
.
So why did I get -1
in the end?
2 answers
The following users marked this post as Works for me:
User | Comment | Date |
---|---|---|
user56529 | (no comment) | May 1, 2022 at 14:52 |
The concept that is important to understand here is the concept of operator precedence.
Assume you have an expression a + b * c
. What does it mean? You could have the following options: (a + b) * c
or a + (b * c)
. By adding the parentheses it can be made clear what shall be computed first, but what without the parentheses?
In mathematics as well as in all programming languages that I am aware of that allow such expressions (some languages don't use this kind of syntax at all) the meaning of a + b * c
is a + (b * c)
. This is because the *
is commonly defined to have a higher precedence than +
. If of two operators one has higher precedence this means, that that one "wins" over the other when it comes to computation order. Since *
has a higher precedence than the +
, you first have to compute the *
and afterwards the +
.
Looking at the expression from the question: (x == 42) * -1 + (x != 42) * x
thus means the same as ((x == 42) * -1) + ((x != 42) * x)
. Thus, when x
has the value 42, this results in (1 * -1) + (0 * x)
that is -1 + 0 which gives -1.
2 comment threads