Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Post increment operator not incrementing in for loop

Tags:

I'm doing some research about Java and find this very confusing:

for (int i = 0; i < 10; i = i++) {   System.err.print("hoo... "); } 

This is never ending loop!

Anybody has good explanation why such thing happens?

like image 463
Michał Kupisiński Avatar asked Jan 28 '13 21:01

Michał Kupisiński


People also ask

Should I use i ++ or ++ i in for loops?

Both increment the number, but ++i increments the number before the current expression is evaluted, whereas i++ increments the number after the expression is evaluated. To answer the actual question, however, they're essentially identical within the context of typical for loop usage.

How does pre increment and Post increment work in for loop?

Pre increment directly returns the incremented value, but post increments need to copy the value in a temporary variable, increment the original and then returns the previous made copy.

How does increment work in for loop?

Increment is an expression that determines how the loop control variable is incremented each time the loop repeats successfully (that is, each time condition is evaluated to be true). The for loop can proceed in a positive or negative fashion, and it can increment the loop control variable by any amount.

Is i ++ the same as ++ i?

i++ is known as post increment whereas ++i is called pre increment. i++ is post increment because it increments i 's value by 1 after the operation is over. Here value of j = 1 , but i = 2 . Here the value of i will be assigned to j first, and then i will be incremented.


1 Answers

for (int i = 0; i < 10; i = i++) { 

The above loop is essentially the same as: -

for (int i = 0; i < 10; i = i) { 

the 3rd part of your for statement - i = i++, is evaluated as: -

int oldValue = i;  i = i + 1; i = oldValue;  // 3rd Step  

You need to remove the assignment from there, to make it work: -

for (int i = 0; i < 10; i++) { 

(On OP request from Comments)

Behaviour of x = 1; x = x++ + x++; : -

As far as your issue as specified in the comment is concerned, the result of the following expression: -

x = 1;  x = x++ + x++; 

is obtained as follows: -

Let's mark different parts of the second statement: -

x = x++ + x++; R    A     B 

Now, first the RHS part (A + B) will be evaluated, and then the final result will be assignmed to x. So, let's move ahead.

First A is evaluated: -

old1 = x;  // `old1 becomes 1` x = x + 1; // Increment `x`. `x becomes 2` //x = old1; // This will not be done. As the value has not been assigned back yet. 

Now, since the assignment of A to R is not done here, the 3rd step is not performed.

Now, move to B evaluation: -

old2 = x;  // old2 becomes 2. (Since `x` is 2, from the evaluation of `A`) x = x + 1; // increment `x`. `x becomes 3`. // x = old2; // This will again not be done here. 

Now, to get the value of x++ + x++, we need to do the last assignment that we left in the evaluation of A and B, because now is the value being assigned in x. For that, we need to replace: -

A --> old1 B --> old2   // The last assignment of both the evaluation. (A and B)  /** See Break up `x = old1;` towards the end, to understand how it's equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/ 

So, x = x++ + x++, becomes: -

x = old1 + old2;   = 1 + 2;   = 3;  // Hence the answer 

Break up of 3rd part of x = x++, to see how it works in x = x++ + x++ case: -

Wonder why the replacement is done as A --> old1 and not x --> old1, as in case of x = x++.

Take a deep look at x = x++ part, specially the last assignment: -

x = oldValue; 

if you consider x++ to be A here, then the above assignment can be broken into these steps: -

A = oldValue; x = A; 

Now, for the current problem, it is same as: -

A = old1; B = old2; x = A + B; 

I hope that makes it clear.

like image 125
Rohit Jain Avatar answered Oct 05 '22 19:10

Rohit Jain