Я занимаюсь некоторыми исследованиями в области Java и считаю это очень запутанным:
for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}
Это бесконечный цикл!
У кого-нибудь есть хорошее объяснение, почему такое происходит?
Я занимаюсь некоторыми исследованиями в области Java и считаю это очень запутанным:
for (int i = 0; i < 10; i = i++) {
  System.err.print("hoo... ");
}
Это бесконечный цикл!
У кого-нибудь есть хорошее объяснение, почему такое происходит?
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;
Я надеюсь, что это ясно.
Вы используете 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... ");
}
из-за я = я ++
for (int i = 0; i < 10;  i++) {
  System.err.print("hoo... ");
}
i ++ сообщит о значении я и приращении THEN. Это также означает, что вам не нужно устанавливать я равным я ++, просто измените на
for (int i = 0; i < 10; i++) {