Q&A

# Explaining the result of an arithmetic expression in JavaScript

+1
−4

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?

Why does this post require moderator attention?
Why should this post be closed?

1 + 0 * 42 MEANS -42 ??? (4 comments)

+5
−0

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.

Why does this post require moderator attention?

+2
−0
Now, (x != 42) which is false yields 0

OK so far.

so I have expected to get in console "-42"

No. As you say, the expression evolves:

(x == 42) * -1 + (x != 42) * x
(1) * -1    +    (0) * x
-1       +       0

Negative one plus zero is negative one.

Why does this post require moderator attention?