Я занимаюсь некоторыми исследованиями в области 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++) {