Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Notifications
Mark all as read
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?
You might want to add some details to your flag.
Why should this post be closed?

2 comment threads

1 + 0 * 42 MEANS -42 ??? (4 comments)
Zero multiplied by anything is zero, so `0 * 42` is zero. Thus, `-1 + 0 * 42` is `-1 + 0` (because... (3 comments)

2 answers

+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?
You might want to add some details to your flag.

0 comment threads

+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?
You might want to add some details to your flag.

0 comment threads

Sign up to answer this question »

This community is part of the Codidact network. We have other communities too — take a look!

You can also join us in chat!

Want to advertise this community? Use our templates!

Like what we're doing? Support us! Donate