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?
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.
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.
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.
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.
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)
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With