Intereting Posts
Почему веб-служба возвращает данные, даже если IP-адрес в wsdl неверен? Получить последний элемент массива без изменения массива в PHP? Как преобразовать простой массив в ассоциативный массив? Как я могу разместить php-скрипт в сетевом веб-приложении dotnet, размещенном на Azure PHP находит несколько фигурных скобок в строке и заменяет текст внутри MySQL, как вводить нулевые даты Скребущая экранная страница JS Как проверить, пусто ли какие-либо поля в форме PHP: создание расширяемой системы CMS все комбинации строк фиксированной длины, основанные на кодировке использование слияния массива в цикле foreach Есть ли способ получить размер переменной PHP в байтах? preg_replace, вызывающий удаление знаков доллара разделить форматированную дату на отдельный месяц / день / год час / минута / секунда в php Как получить slickgrid div для изменения размера таблицы

Предварительная инкрементация против постинкрементации

Насколько они разные? Вот что я думаю, но я не уверен …

Если вы используете pre-incrementation, например, в цикле for с ++ j, то вы в основном говорите: «Сделайте копию значения j для использования в цикле, затем увеличьте j, а затем выполните инструкции в петля с копией j. " Если вы используете пост-инкрементирование в том же цикле j ++, вы в основном говорите: «Сделайте копию значения j для использования в цикле, а затем выполните инструкции в цикле с копией j, а затем увеличите J «.

Причина, по которой я не уверен, заключается в том, что я создал цикл for, который умножает значение j на 10, а затем выводит результат для j = 1 – j = 12, используя как post, так и pre-incrementation. Пользовательский читаемый вывод точно такой же, как и после и после инкремента. Я думаю: «Как выходы одинаковы, если нет какой-либо операции копирования?»

Итак, я предполагаю, что разница между pre- и post-incrementation действительно становится важной, в php, когда я использую ссылки (которые действуют как указатели в php), а не имена для возвращаемых значений? Это связано с тем, что копии ссылок не выполняются, поэтому предварительная инкрементация будет следующей: «Приращение j, затем выполните инструкции в цикле с измененным значением j, затем увеличивайте j снова …», инкремент будет выглядеть так: «Используйте значение j для операторов в цикле, затем измените значение j, затем перейдите в цикл с новым значением j …»

Solutions Collecting From Web of "Предварительная инкрементация против постинкрементации"

Pre- или post-incrementing не магически задерживают вещи до более позднего времени. Это просто встроенная стенография.

введите описание изображения здесь

 // pre-increment $var = 5; print(++$var); // increments first, then passes value (now 6) to print() // post-increment $var = 5; print($var++); // passes value (still 5) to print(), then increments 

Теперь давайте посмотрим на цикл.

 for ($i = 0; $i < 9; $i++) { print($i); } 

Последняя часть декларации цикла ( $i++ ) – это просто оператор, который должен выполняться каждый раз через цикл. Он «передает» значение нигде, а затем увеличивает его. $i в то время не используется. Позже, когда выполняется следующий оператор ( print($i); ), значение $i уже увеличилось.

 // add 1, then do nothing with $i for ($i = 0; $i < 9; ++$i) {} // do nothing with $i, then add 1 for ($i = 0; $i < 9; $i++) {} 

Каким бы способом вы это ни сделали, $i будет таким же в цикле.


Если это поможет, вы можете думать о них как о небольших процедурах, которые это делают:

 // ++$i { $i = $i + 1; return $i; } // $i++ { return $i; $i = $i + 1; } 

Поскольку я перечитываю ваш вопрос, я думаю, что путаница больше связана с тем, как работает цикл, чем работает оператор увеличения. Помните, что приращение – это простая операция «все в один раз», вот как работает третье выражение в цикле.

 // here's a basic loop for ($i = 0; $i < 9; $i++) { // do loop stuff print($i); } // this is exactly what happens for ($i = 0; $i < 9; ) { // do loop stuff print($i); $i++; } 

Просто потому, что последняя строка может быть помещена в объявление цикла, не дает ей особых полномочий. Нет никаких ссылок или каких-либо ссылок за кулисами. Одна и та же переменная $i видна как внутри, так и вне цикла. Каждый оператор внутри или вне цикла непосредственно ищет значение $i когда это необходимо. Вот и все. Нет смешного дела.

Когда вы выполняете $x++ , вы выполняете пост-инкремент … Это означает, что приращение произойдет только после того, как оператор был оценен.

Итак, учитывая следующий код:

 $x = 10; $y = 0; $z = 5; $y = $z * $x++; 

PHP делает это:

 $x = 10; $y = 0; $z = 5; $y = $z * $x++; // Ignore Post-Increment, Evalutate $y = $z * $x; $y = 5 * 10; // Now Increment x - POST-INCREMENT $x = $x + 1; $x = 10 + 1; $x = 11; // Continue evaluating statement $y = 5 * 10; $y = 50; 

Когда вы выполняете ++$x , вы пре-инкрементируете … Это означает, что приращение произойдет до того, как будет вычисляться оператор:

 $x = 10; $y = 0; $z = 5; $y = $z * ++$x; // Do Pre-Increment $x = $x + 1; $x = 10 + 1; $x = 11; // Evaluate $y = $z * $x; $y = 5 * 11; $y = 55; 

В случае цикла for в PHP PHP вычисляет цикл for следующим образом:

 for($i = 0; $i < 30; $i++) { doSomething(); } // Is evaluated EXACTLY as such by PHP $i = 0; while($i < 30) { doSomething(); $i++; } 

Первое выражение ( $i = 0 ) оценивается (выполняется) безоговорочно в начале цикла.

В начале каждой итерации $i < 30 . Если он оценивает значение TRUE, цикл продолжается и выполняется вложенный оператор (ы). Если он вычисляет значение FALSE, выполнение цикла завершается.

В конце каждой итерации $i++ оценивается (выполняется) как независимое выражение.

Поэтому пост-инкрементирование или предварительное приращение переменной в качестве третьего выражения в цикле не влияет на его поведение. В этом простом случае оба выражения будут вести себя точно так же .

Однако в сложном цикле, таком как:

 for($i = $j = 0; $i < 30; $i += ++$j) { $j = getResult($j); } 

Пошаговое или предварительное приращение $j напрямую влияет на значение $i соответствии с приведенными выше примерами. В этом случае вам нужно выбрать именно то, что вы хотите сделать.

 $i = 0; echo $i++; echo $i; $j=0; echo ++$j; echo $j; 

Предварительный прирост отображает увеличенное значение. Но значение отображения приращения Post затем увеличивается. О коде будет выводиться 01 и 11