Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> $i++ и ++$i 
V
    Опции темы
BIG BROTHER
Дата 11.2.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 9.12.2004
Где: Россия, Москва

Репутация: 2
Всего: 4



Код
$i = 1;
$i += $i++ + ++$i;
echo $i;


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

Это сообщение отредактировал(а) BIG BROTHER - 11.2.2010, 11:11
--------------------
Mess with the best, die like the rest
PM MAIL ICQ   Вверх
Ипатьев
Дата 11.2.2010, 11:22 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Как функционируют выражения, надо проверять другим кодом
к примеру, чтобы выяснить, как функционирует $i++, надо написать код с $i++
логично?
PM MAIL   Вверх
MoLeX
Дата 11.2.2010, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



5 будет вот так
Код

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



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Guedda
Дата 11.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 13
Всего: 78



Получается так:
1. 1+2 = 3 
Код

$i += ++$i;

2. 4+3 = 7
Код

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

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

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

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

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


--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
nerezus
Дата 11.2.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



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

Цитата

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

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

Это сообщение отредактировал(а) nerezus - 11.2.2010, 13:40


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
awers
Дата 11.2.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: 21
Всего: 31



PM MAIL WWW ICQ Skype   Вверх
sTa1kEr
Дата 11.2.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Выражение $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

Это сообщение отредактировал(а) sTa1kEr - 11.2.2010, 13:57
PM MAIL   Вверх
Ипатьев
Дата 11.2.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



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

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

Это сообщение отредактировал(а) Ипатьев - 11.2.2010, 14:10
PM MAIL   Вверх
nerezus
Дата 11.2.2010, 14:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



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

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


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0800 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.