на самом деле, только былокодер может такое написать. Нормальный программист 10 раз подумает, а потом всё равно поставит скобки, что-бы при поддержке кода не удивляться.
К тому-же это не баг, а документированная фича
<?php
// на первый взгляд, следующий код должен вывести 'true'
echo (true?'true':false?'t':'f');
// однако, он выводит 't'
// это происходит потому, что тернарные выражения вычисляются слева направо
// это намного более очевидная версия вышеприведенного кода
echo ((true ? 'true' : false) ? 't' : 'f');
// здесь вы можете видеть, что первое выражение вычисляется в 'true', которое
// в свою очередь вычисляется в (bool)true, таким образом возвращая истинную ветвь
// второго тернарного выражения.
?>
Нормальный программист 10 раз подумает, а потом всё равно поставит скобки
Еще раз:
низкий порог вхождения
нормальный программист
Я нигде не утверждал, что такой код хорошо писать. Но то, что пых весь из себя исключительный один единственный эту конструкцию обрабатывает не так, как остальные языки (даже тот же Си, на котором пых написан), превращает его новичков в аморфную массу. После такого и других приколов с naming inconsistences, parameters order inconsistences и прочего новичок нормальным станет разве что под дулом пулемета.
Кстати говоря, такая специфичная отработка множественной тернарности в пыхе говорит о том, что пых «додумывает» за своего пользователя. Зачем, спрашивается? Кто его просил расставлять скобки (или подразумевать их) там, где пользователь их не поставил?
// однако, он выводит 't'
// это происходит потому, что тернарные выражения вычисляются слева направо
И уж вот такое объяснение - вообще бомба. Хрен поймешь, как оно все же обрабатывает эту конструкцию.
А то, что в пыхе - это не отучивают, а всего лишь говорят: «в нашем языке вот такая конструкция работает так». Заметь, не «в нашем языке, в отличие от всех остальных», а просто «в нашем языке». Неподготовленный пользователь (результат выхлопа которого я и наблюдал) додумает сам в себе и распространит это на if(), while() и т.д., после чего и рождаются высеры вида if ($a == $b && isset($a))
Но то, что пых весь из себя исключительный один единственный эту конструкцию обрабатывает не так, как остальные языки (даже тот же Си, на котором пых написан), превращает его новичков в аморфную массу.
вы говори так, как будто одна эта «фича» убивает мозг напрочь. Тут так, в Си по другому, в других языках может быть тоже по другому, ты хочешь консистентности среди всех 4812 языков?
я по себе сужу: я же говорю, я когда был молодым, расставлял скобки в таких выражениях, и презирал тех, кто так не делает. А сейчас таких просто не понимаю — самим же мучиться со своим говнокодом!
Кстати говоря, такая специфичная отработка множественной тернарности в пыхе говорит о том, что пых «додумывает» за своего пользователя. Зачем, спрашивается? Кто его просил расставлять скобки (или подразумевать их) там, где пользователь их не поставил?
как раз для «низкого порога». Разве не очевидно, что это палка о двух концах? C++ с радостью жрёт class->void*->class, и тоже всё работает, ты же это не считаешь недостатком? Да, если сказать фигню C++, то C++ с радостью выполнит эту фигню, и не поперхнётся. В отличие от C++ php попытается «угадать», какой смысл кодер вкладывает в фигню. ИЧСХ, почти всегда угадывает. Ошибается только в совсем уж клинических случаях, вроде описанного тобой. Кодера можно пожалеть: наворотил какую-то НЁХ, и плачет, что интерпретатор его «неправильно» понял.
И уж вот такое объяснение - вообще бомба. Хрен поймешь, как оно все же обрабатывает эту конструкцию.
// однако, он выводит 't' // это происходит потому, что тернарные выражения вычисляются слева направо
И уж вот такое объяснение - вообще бомба. Хрен поймешь, как оно все же обрабатывает эту конструкцию.
Ну а в php порядок выполнения жёсткий, и лично я не понимаю, с чего ты взял, что ассоциативность слева-направо для тернарной операции хуже, чем справа-налево? Тем, что в C/C++ не так? Ну не так. Но там ещё хуже — там даже скобки не помогут из-за побочных эффектов. Т.е. X*Y*Z даёт всегда один и тот же результат, однако, это вовсе не означает, что X вычисляется первым. В php с этим проще, в php никто тебе ничего не перепутает, и будет _всегда_ вычисляться X потом Y, а потом Z.
В этом смысле php куда как более безопасен, ибо в нём мимо грабель не пройдёшь — твоя конструкция _всегда_ даёт f. А вот что-то такое в C/C++ может давать то, что тебе хочется. А в самый ответственный момент ВНЕЗАПНО выдать что-то другое.
Потому, для сишника, такие фокусы пхп — детская забава, просто ещё одна новая особенность ЯП. В C/C++ особенности куда как злее и подлее. Ибо умеют таиться в самом невинном коде, да ещё и правильно работать до поры до времени.
А то, что в пыхе - это не отучивают, а всего лишь говорят: «в нашем языке вот такая конструкция работает так». Заметь, не «в нашем языке, в отличие от всех остальных», а просто «в нашем языке». Неподготовленный пользователь
неподготовленный пользователь должен готовится, а не писать непонятную ему НЁХ. Или пусть не ноет, а пишет нормально. Это разве так сложно? Разве мануал засекречен? Разве там не сказано по-русски, так делать НЕ НУЖНО ?!
И да, про отступы — это проблема IDE, которая и должна расставлять эти ваши отступы следуя гайдлайнам. Программист не должен на это отвлекаться.
додумает сам
вон из профессии. Любой. Даже если ты канаву капаешь, ты её по плану должен капать, а если не ясно — идти к прорабу. А таким додумывателям место не в продакшене, а в богеме, инсталляции креативить.
В части «язык выполняет то, что написано, так, как написано (если может скомпилить), а не додумывает за пользователя» - да.
тогда начинай хоронить C/C++
int x=17;
return x-- - --x;
Вот тебе типичный случай, когда сишечка додумывает за быдлокодером. Хороший компилятор в этом случае вернёт константный ноль, ибо константный ноль проще всего «считать» и возвращать. А если ты думал иначе — это твоя проблема.
Слева-направо. А вот как так надо извернуться, чтобы, читая предложенный тернар слева-направо, получить 'f', я до сих пор не понимаю. Ладно скобки явно указаны, тогда другое дело...
А вот как так надо извернуться, чтобы, читая предложенный тернар слева-направо, получить 'f', я до сих пор не понимаю.
бывает. Я тоже поначалу офигел. Но не удивился, потому-что у меня есть небольшой опыт. И этот опыт мне подсказывает, что компилятор и интерпретатор не думает, а просто парсит строку. И в первую очередь парсер ищет операцию с самым высоким приоритетом. А САМЫЙ высокий приоритет у той «операции», которая является продолжением текущей. Тернарная операция является операцией с тремя аргументами, вот она и заканчивается _сразу_ после обработки второго. Т.е. true ? 't' : false. И это, кстати, общее соглашение(C/C++/bash/shell/etc). Например в bash'е парсер сначала [] закрывает, а уж потом думает, что получилось. Так и в php — сначала закрывается ?:, а уж потом интерпретатор думает дальше.
В C/C++ точно также. НО. По правилам K&R ассоциативность ?: другая, как у «равно». Парсер просматривает строку задом наперёд, и также откусывает false ? 'f' : 'n'. Почему K&R так решили — я не знаю. Может быть из тех соображений, что многие в эту ловушку попадаются, и помогли немного. Сейчас поздно уже что-то менять.
В любом случае, сишник ТАКОЕ напишет только своему злейшему врагу.
Ладно скобки явно указаны, тогда другое дело...
ну вот видишь? А в сишечке даже скобки не помогают. Там компилятор как хочет переставляет, и ему пофиг до твоего мнения. Его мнение в том, что A+(B+C)===(A+B)+C. А если ты так не думаешь — ССЗБ. ИЧСХ, в C++ такие баги всплывают даже чаще, чем ошибки из-за указателей.
всего лишь демонстрация «язык запрещает пользователю», а не «рекомендует настроить IDE правильным образом».
запрещать глупо и бесполезно. Не веришь? Мне зайти на говнокод.ру и зайти в раздел говнопитон? Гвидо конечно молодец, что такую фичу решился сделать, но это IRL слабо помогает. Разве что чисто психологически, полезно говнокодера бить по рукам. Для его-же блага.
Вот только это лишь начинающих касается, у меня VIM без всяких подсказок ставит что надо. Мне фиолетово. И более того, если Патрику нравилось в 1993м году делать отступы в 2 пробела, то мой VIM в 2013ом будет в скриптах Патрика ставить два пробела. А я не буду ламать голову, как оно надо (было 20 лет назад, когда я, блин, первый helloworld писал).
так и сделал. Теперь он к коду и близко не подпускается.
ну и правильно. Такие не лечатся. Хоть кол на голове теши. У меня друг есть такой, тоже раньше кодером был. А сейчас просто алкаш.