![]() |
|
Модераторы: skyboy, MoLeX, Aliance, ksnk |
![]()
|
|
| ruskar |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2009 Репутация: нет Всего: нет |
Попался мне тут один тестик. На первый взгляд весьма простой. Логически просчитав его в уме, я получил одно значение. Запускаю для проверки код, и… интерпретатор PHP выдаёт мне совсем другое. Задачка была следующая:
Отмечаю, что переменные $a и $b не инициализированы, соответственно в данном выражении они везде примут значение false. Тернарный оператор ?: имеет правую ассоциативность, но выражение выполняется как-то вообще ни правым, ни левым способом. Для понимания ситуации возьму кусок правой части выражения, в котором уже видна проблема, и упрощу его:
Если я правильно понимаю ассоциативность, то порядок выполнения операций здесь такой: 1. Сначала выполняется true ? 7 : 8, в результате получаем 7. 2. Затем выполняется false ? 5 : 6, в результате получаем 6. 3. В конце выполняется true ? 6 : 7, в результате получаем… думаете 6? А вот и нет, выводится 7! Так каков же на самом деле порядок выполнения операций? И почему мы получаем в результате 6? Это сообщение отредактировал(а) ruskar - 10.3.2009, 08:26 |
||||
|
|||||
| ksnk |
|
|||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 96 Всего: 386 |
Если скобочки расставить так, как сделал бы это PHP - получится вот так:
-------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! |
|||
|
||||
| MoLeX |
|
|||
![]() Местный пингвин ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 4076 Регистрация: 17.5.2007 Репутация: 46 Всего: 140 |
ruskar, совет - приведи в обычный вид.
-------------------- Amazing |
|||
|
||||
| ruskar |
|
||||||||||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2009 Репутация: нет Всего: нет |
Разве? То, что вы показываете, называется _левой_ ассоциативностью, а тернарный оператор имеет _правую_ ассоциативность. Вообщем кажется я понял как это решается. Сначала выполняется:
в результате возвращается 7 и дальнейшее выражение выглядит примерно так:
Затем уже выполняется:
И тут казалось бы интерпретатор видимо берёт «самое правое» значение 7, после чего всё становится логичным, НО…
Выдаёт 6! Всё, я окончательно запутался о_О Добавлено @ 09:05
Это как? Тут ещё возникла версия, что интерпретатор просто берёт самое правое вхождение тернарного оператора, а всё остальное отметает. Т.е. выражение вида:
превращается в:
Тогда с результатами экспериментов всё сходится. Хотя что-то я с подозрением отношусь к этой версии. Это сообщение отредактировал(а) ruskar - 10.3.2009, 09:07 |
||||||||||||||||||
|
|||||||||||||||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 5 Всего: 454 |
А не поленитесь сперва посмотреть справку, а? тогда не придётся выдавать вот такого рода фразы... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ruskar |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2009 Репутация: нет Всего: нет |
Пардон, меня дезинформировали насчёт:
оказывается здесь в результате вообще выдаётся ошибка:
Это сообщение отредактировал(а) ruskar - 10.3.2009, 09:12 |
||||
|
|||||
| ruskar |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 18.1.2009 Репутация: нет Всего: нет |
Извиняюсь, Akina оказался прав. Просто я когда начал проверять результаты своего вычисления в голове, полез за объяснением во всемогущий Гугл, чтобы узнать ассоциативность тернарного оператора (точнее, чтобы убедиться, что он имеет правую ассоциативность). Половина найденных в онлайне учебников говорила, что да, тернарный оператор имеет правую ассоциативность (например тут: http://depositfiles.od.ua/php/03.php), поэтому я и попал в ступор. Потом уже когда перерыл официальную документацию, всё же нашёл, что тернарный оператор в PHP имеет левую ассоциативность, и на самом деле это является ошибкой. Нашёл у тёти Вики страничку с подробным описанием проблемы. Цитата:
Добавлено через 9 минут и 47 секунд Akina, а если брать исходное тестовое задание, и делать по левой ассоциативности, то где я допускаю ошибку? Вот смотри, если исходное тестовое сократить, вычислив выражения в скобках, то получится:
Выводит 7. Исходя теперь уже из левой ассоциативности расставляем скобки:
Выводит 6. о_О Не пойму, почему. Как же всё-таки интерпретатор РНР считает это выражение? Хочется всё-таи докопатся до сути. |
||||||||
|
|||||||||
| sTa1kEr |
|
|||
|
9/10 программиста ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1553 Регистрация: 21.2.2007 Репутация: 56 Всего: 146 |
Кто-же так скобки-то расставляет? Слева-направо означает слева-направо, а не наобум. 1. echo true ? (false ? 1 : 2) : false ? false ? 3 : 4 : true ? false ? 5 : 6 : true ? 7 : 8; 2. echo (true ? (false ? 1 : 2) : false) ? false ? 3 : 4 : true ? false ? 5 : 6 : true ? 7 : 8; 3. echo (true ? (false ? 1 : 2) : false) ? (false ? 3 : 4) : true ? false ? 5 : 6 : true ? 7 : 8; 4. echo ((true ? (false ? 1 : 2) : false) ? (false ? 3 : 4) : true) ? false ? 5 : 6 : true ? 7 : 8; 5. echo ((true ? (false ? 1 : 2) : false) ? (false ? 3 : 4) : true) ? (false ? 5 : 6) : true ? 7 : 8; 6. echo (((true ? (false ? 1 : 2) : false) ? (false ? 3 : 4) : true) ? (false ? 5 : 6) : true) ? 7 : 8; 7. echo ((((true ? (false ? 1 : 2) : false) ? (false ? 3 : 4) : true) ? (false ? 5 : 6) : true) ? 7 : 8); |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 12 Всего: 43 |
|
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 75 Всего: 260 |
||||
|
||||
![]()
|
| Правила форума "PHP" | |
|
|
Новичкам:
Важно:
Внимание:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |