Подтвердить что ты не робот

Оператор приращения post не увеличивается в цикле

Я занимаюсь некоторыми исследованиями в области Java и считаю это очень запутанным:

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

Это бесконечный цикл!

У кого-нибудь есть хорошее объяснение, почему такое происходит?

4b9b3361

Ответ 1

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

Вышеуказанный цикл по существу совпадает с: -

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

часть 3 rd вашего оператора for - i = i++, оценивается как: -

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

Вам нужно удалить задание, чтобы заставить его работать: -

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

(по запросу OP из комментариев)

Поведение x = 1; x = x++ + x++;: -

Что касается вашей проблемы, указанной в комментарии, то результат следующего выражения: -

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

получается следующим образом: -

Пусть обозначают разные части второго утверждения: -

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

Теперь сначала оценивается часть RHS (A + B), а затем конечный результат будет присваиваться x. Итак, давайте двигаться вперед.

Сначала оценивается A: -

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.

Теперь, поскольку назначение A на R здесь не выполняется, третий шаг не выполняется.

Теперь перейдите к B оценке: -

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.

Теперь, чтобы получить значение x++ + x++, нам нужно выполнить последнее присваивание, которое мы оставили при оценке A и B, потому что теперь это значение присваивается в x. Для этого нам нужно заменить: -

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 equivalent to `A = old1; in case of `x = x++`, considering `x++ <==> A` in this case. **/

Итак, x = x++ + x++, становится: -

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

Разбейте третью часть x = x++, чтобы увидеть, как она работает в x = x++ + x++ case: -

Интересно, почему замена выполняется как A --> old1, а не x --> old1, как в случае x = x++.

Взгляните на часть x = x++, особенно последнее назначение: -

x = oldValue;

если вы считаете, что x++ здесь A, тогда указанное назначение можно разбить на следующие этапы: -

A = oldValue;
x = A;

Теперь, для текущей проблемы, это то же самое, что: -

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

Я надеюсь, что это ясно.

Ответ 2

Вы используете post-increment: i = i++;, это означает что-то вроде этого:

temp = i;
i = i + 1;
i = temp;

потому что 15.14.2 Оператор приращения Postfix ++:

Значение выражения приращения postfix - это значение переменной до, в которой сохраняется новое значение.

Вот почему у вас есть старое значение.

Завершение цикла:

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

Ответ 3

из-за я = я ++

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

Ответ 4

i ++ сообщит о значении я и приращении THEN. Это также означает, что вам не нужно устанавливать я равным я ++, просто измените на

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