Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > $i++ и ++$i


Автор: BIG BROTHER 11.2.2010, 11:09
Код
$i = 1;
$i += $i++ + ++$i;
echo $i;


Не очень понимаю логику вычислений. Выходит 7, но по моим расчетам там должно быть 5...
Может я не очень понимаю как функционируют эти выражения?
Насколько я знаю $i++ — производит вычисление, затем увеличение значения на единицу, ++$i — наоборот, сразу увеличивает.
Я не прав? Как тогда работает конструкция "+=" (что она делает — я знаю, интересен порядок выполнения).

Автор: Ипатьев 11.2.2010, 11:22
Как функционируют выражения, надо проверять другим кодом
к примеру, чтобы выяснить, как функционирует $i++, надо написать код с $i++
логично?

Автор: MoLeX 11.2.2010, 12:23
5 будет вот так
Код

$i = 1;
$i += $i++ + $i;
echo $i;

Автор: Guedda 11.2.2010, 12:36
Получается так:
1. 1+2 = 3 
Код

$i += ++$i;

2. 4+3 = 7
Код

$i++ + ++$i /* точнее, результат первого */

Вот так считается. Первое действие - до вычисления. Второе действие - после вычисления.

Добавлено через 1 минуту и 59 секунд
Даже заведем для этого еще одну переменную ($p),тогда
Код

$i += ++$i;
$p = $i;
$result = $i++ + $p;

Вот так будет наглядней.

Автор: nerezus 11.2.2010, 13:37
BIG BROTHER, ты понимаешь, что запостил в раздел по профи примитивный вопрос по синтаксису?

Цитата

что она делает — я знаю, интересен порядок выполнения
 Смотри мануал. У нее самый низкий приоритет.
http://ru.php.net/manual/en/language.operators.precedence.php

Тему хотел переместить, но кто-то это уже сделал ))

Автор: awers 11.2.2010, 13:40
http://www.php.net/manual/en/language.operators.increment.php

Автор: sTa1kEr 11.2.2010, 13:48
Выражение $i += N можно записать как $i = $i + N. Соответственно, 
Код

$i += $i++ + ++$i; 

можно записать как:
Код

$i = $i + ( $i++ + ++$i );

Далее ++$i инкрементирует $i и возвращает $i, соответственно выражение можно записать как $i += 1 или $i = $i + 1
Код

$i = $i + ( $i++ + ($i = $i + 1) );

А $i++ наоборот, сначала возвращает значение $i, а затем инкрементирует его, в общем случае это можно записать как ($i = $i + N) - N, или ($i = $i + 1) - 1. // естественно PHP на самом деле ничего не вычитает, это только что бы смоделировать формулу
Код

$i = $i + ( (($i = $i + 1) - 1) + ($i = $i + 1) );

Ну а дальше все в соответствии с приоритетами:
Код

$i = 1;

$i = $i + ( (($i = $i + 1) - 1) + ($i = $i + 1) );
//           ^^^^^^^^^^^^^ = 2, $i = 2

$i = $i + ( (2 - 1) + ($i = $i + 1) );
//          ^^^^^^^ = 1

$i = $i + ( 1 + ($i = $i + 1) );
//              ^^^^^^^^^^^^^ = 3, $i = 3

$i = $i + ( 1 + 3 );
//        ^^^^^^^^^ = 4

$i = $i + 4;
//   ^^^^^^ = 7

$i = 7


http://php.net/operators.increment

Автор: Ипатьев 11.2.2010, 13:59
Ну нет.
Это далеко не примитивный вопрос по синтаксису. Скорее вопрос по работе компилятора.
Если смотреть на код, а не на вопрос

Гм. Раньше я видел другое объяснение. Объяснение sTa1kEr-а мне нравится больше

Автор: nerezus 11.2.2010, 14:12
Ипатьев, ну в разделе по С++(к примеру) это был бы вопрос по компилятору, т.к. синтаксис не определяет ответ, и на C++ были бы верными ответы 5, 6, 7, 666. В PHP же это определено, но на практике применяется лишь дураками. Былинными дураками. Былинный - т.к. в реальной жизни таких не бывает.

А вот откуда такой вопрос взялся - не понятно. Скорее всего какой-то сноб на собеседовании задал?) Совет топикстартеру: не ходи к ним, у них плохо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)