Прохожу в книге тему "операторы инкремента и декремента" и ни хрена не могу понять.
Мне понятно, что инкремент – это увеличение (от слова increase), а декремент – это уменьшение (от слова decrease). Но вот дальше…
Вот тут http://php.su/learnphp/operators/?id пишется, что существуют префиксные и постфиксные инкременты и декременты.
Префиксный инкремент (++$a) увеличивает $a на единицу и возвращает значение $a.
Постфиксный инкремент ($a++) возвращает значение $a, а затем увеличивает $a на единицу.
Префиксный декремент (--$a) уменьшает $a на единицу и возвращает значение $a.
Постфиксный декремент ($a--) возвращает значение $a, а затем уменьшает $a на единицу.
Первое, что не понятно, - в чём разница между префиксным и постфиксным:
- сначала увеличением $a на единицу, а затем возвращением значение $a;
и
- сначала возвращением значения $a, а затем увеличения $a на единицу ?
Это выглядит просто как перемена мест слагаемых. Результат то не меняется.
Увеличение на единицу – это понятно. Непонятно куда возвращается значение $a ? Чем, оператором ?
И дальше приводится пример:
$a=10;
$b=$a++;
echo "a=$a, b=$b" // Выводит a=11, b=10
Почему a=11, а b=10 ? Ведь $а изначально равна 10 ($a=10;).
Затем используется постфиксный инкремент ($a++), который возвращает значение $a (опять таки, непонятно кому и зачем ?), а затем увеличивает $a на единицу. Т.е. получается, что постфиксный инкремент в данном случае возвращает переменной "а" ($a) её же значение – "10", а затем увеличивает это значение на единицу. Далее значение "11" оператором присваивания присваивается переменной "b" ($b). Получается, что значение переменной "b" будет равно "11". Но в приведённом выше примере всё наоборот.
Я не понимаю логику этих операторов. Кто-нибудь может доступно объяснить ?
Далее.
В книге, в которой я смотрю эту тему http://depositfiles[dot]od[dot]ua/php/03.php#d приводится следующий пример:
$i=15; // Присвоить $i целое число 15
$a=$i--; // СНАЧАЛА присвоить $a значение $i, а ЗАТЕМ уменьшить $a
$b=++$i; //СНАЧАЛА увеличить $i, а ЗАТЕМ присвоить увеличенное значение $i переменной $b
Вопрос следующий.
Учитывая, что и инкремент с декрементом, и оператор присваивания имеют правостороннюю ассоциативность, то почему в строке ($a=$i--;) сначала выполняется оператор присваивания, а потом постфиксный декремент ?
Ведь правосторонняя ассоциативность означает, что последовательность выполнения операторов будет происходить справа налево, т.е. получается, что сначала должен выполниться постфиксный декремент, а потом оператор присваивания.
Кроме того. Прописал я этот код:
$i=15;
print $i."<br>";
$a=$i--;
print $a."<p>";
По идее на экран должно вывести число 15, а под ним число 14, поскольку переменной $a присвоилось значение переменной $i (т.е. число 15), а затем это значение уменьшилось на единицу. Но у меня выводятся два числа 15 (одно под другим). Почему значение $a не уменьшается на единицу ?
1. Oleh - 17 Августа, 2011 - 22:58:03 - перейти к сообщению
2. LIME - 18 Августа, 2011 - 00:06:13 - перейти к сообщению
Oleh пишет:
присваивает значение только 1 раз....тоесть присваивает 10 потом увеличивает и все...на этом все действия закончены....при последующих обращениях к $a будет возвращено уже 11
Т.е. получается, что постфиксный инкремент в данном случае возвращает переменной "а" ($a) её же значение – "10", а затем увеличивает это значение на единицу. Далее значение "11" оператором присваивания присваивается переменной "b" ($b). Получается, что значение переменной "b" будет равно "11".
3. Oleh - 18 Августа, 2011 - 01:38:09 - перейти к сообщению
LIME пишет:
присваивает значение только 1 раз....тоесть присваивает 10 потом увеличивает и все...на этом все действия закончены....при последующих обращениях к $a будет возвращено уже 11
Это всё ты говоришь о переменной $a ?
$a=10; // это присвоение значения 10 переменной
$a++; // это увеличение значения переменной $a на единицу
А почему переменная $b равняется 10, если "$a++" - это уже 11 и эти 11 присваиваются переменной $b ?
$b=$a++;
4. LIME - 18 Августа, 2011 - 01:45:27 - перейти к сообщению
Oleh пишет:
что непонятного?сначала возвращением значения $a, а затем увеличения $a на единицу ?
(Добавление)
бросай это дело
программировать это не твое
(Добавление)
сначала присваивается а потом увеличивается при постинкременте
и после увеличения уже не присваивается
русским по белому написано!!!
(Добавление)
попробую как ребенку объяснить )))
есть 2 коробочки
1 пустая в другой карандаши
смотрим сколько карандашей в второй коробочке и кладем в первую столько же
потом в вторую кладем еще 1 карандаш
5. Oleh - 18 Августа, 2011 - 02:06:40 - перейти к сообщению
LIME пишет:
что непонятного?
(Добавление)
бросай это дело
программировать это не твое
(Добавление)
сначала присваивается а потом увеличивается при постинкременте
и после увеличения уже не присваивается
русским по белому написано!!!
(Добавление)
бросай это дело
программировать это не твое
(Добавление)
сначала присваивается а потом увеличивается при постинкременте
и после увеличения уже не присваивается
русским по белому написано!!!
Ты объяснять нормально научись !
Сначала прочитай мой вопрос полностью, а уже потом пытайся что-то промычать.
Я в своём вопросе всё чётко изложил, что мне непонятно. А ты отвечаешь какими-то обрывками, ещё больше людей путаешь.
Чего ты вообще на этот форум зашёл и эфир тут засоряешь ? Советовать всем, кто не понимает твои "объяснения", что программирование - это не их дело ? Так мы и без тебя, такого "грамотея" разберёмся, что нам делать.
Не умеешь объяснять - не объясняй ! Тебя лично никто об этом не просил.
6. LIME - 18 Августа, 2011 - 02:10:47 - перейти к сообщению
я выше добавил специально для недалеких хамов объяснение ))
7. Мелкий - 18 Августа, 2011 - 09:13:04 - перейти к сообщению
Oleh пишет:
Увеличение на единицу – это понятно. Непонятно куда возвращается значение $a ? Чем, оператором ?
считайте, что это - функция:
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- /**
- * постфиксный инкремент
- */
- function postfix_incr(&$arg) {
- $t = $arg;
- $arg = $arg+1;
- return $t;
- }
- /**
- * префиксный инкремент
- */
- function prefix_incr(&$arg) {
- $arg = $arg+1;
- return $arg;
- }
Внимание на ретурны.
И не стоит хамить.