Почему оператор постинкремента ($ j ++) никогда не меняет $ j с 0? - PullRequest
2 голосов
/ 18 февраля 2012

Я столкнулся со странной проблемой с оператором приращения.Что должен выводить код, приведенный ниже?

$j = 0;
for ($i=0; $i<100; $i++)
{
    $j = $j++;
}
echo $j;

Это повторяет 0. Почему не 100?


Редактировать: Когда я изменяю $j = $j++ на $j = ++$j, оно повторяет 100.

Ответы [ 3 ]

7 голосов
/ 18 февраля 2012

Вы делаете "постинкремент", так как ++ появляется ПОСЛЕ переменной, которую он модифицирует. Код, написанный в менее компактной форме, сводится к:

for ($i = 0; $i < 100; $i++) {
   $temp = $j;  // store j
   $j = $j + 1;  // $j++
   $j = $temp; // pull original j out of storage
}

Если бы у вас было ++$j, то j увеличило бы ПЕРВЫЙ, и результирующее увеличенное значение вернулось бы к J. Однако такая структура имеет мало смысла. Вы можете просто написать

 for (...) {
    $j++;
 }

, который сводится к

for (...) {
   $j = $j + 1;
}
6 голосов
/ 18 февраля 2012

Проблема со строкой

$j = $j++;

Эта команда оценивает $j как 0, затем увеличивает $j до 1 и, наконец, присваивает 0 обратно $j.

Либо используйте $j = $j + 1;, либо просто $j++;.

3 голосов
/ 18 февраля 2012

$j++ является постинкрементным: значение выражения равно $j, затем $j увеличивается. Таким образом, вы получаете значение j, затем увеличиваете j, затем устанавливаете j в исходное значение j.

...