В мире существует множество языков программирования и каждый из них имеет свои маленькие особенности — странный синтаксис, необычный функционал или нестандартные реализации.
Иногда это сбивает с толку не только новичков, но и опытных разработчиков.
Иногда эти причуды серьезно мешают выучить язык или, наоборот, становятся его общеизвестной особенностью.
Подобных вещей в языках программирования очень много, но мы выбрали для вас самые известные.
Пустые строки в Oracle SQL
Изображение предоставлено Ником Хьюзом CC BY 2.0 Oracle считает, что строки нулевой длины эквивалентны NULL. Это существенное отличие от других баз данных и стандарта SQL ANSI/ISO, который подразумевает, что пустая строка — это ранее известное значение, а NULL — неизвестное значение, и они не могут быть эквивалентными.
Это может вызвать головную боль при написании кода для нескольких СУБД или переписывании кода.
Путаница возникла еще в 1979 году, когда была выпущена первая версия SQL, а соответствующий стандарт еще не был разработан.
Однако Oracle предупреждает, что такое явление пустой строки может исчезнуть в ближайшем будущем.
Кавычки:
«Да, это одна из «замечательных» особенностей Oracle DB» — Лукас Эдер «Пустая строка эквивалентна NULL не более, чем числу 0» — Бен Бланк «ЧТО?! Я так рада, что мы не используем Oracle. Это пугает» - Джефф Дэвис+ как универсальный оператор конкатенации в JavaScript
Изображение предоставлено MicroAssist CC BY-SA 2.0 Оператор + перегружен в JavaScript и служит как для математического сложения чисел, так и для объединения строк.
То есть, если один из операндов строчный, а другой числовой, то условно вместо 1+1=2 вы получите «1»+1=’11»: JavaScript преобразует число в строку без предупреждения.
Причиной этого является недостаточный контроль над совместимостью типов.
Например, в Python + используется точно для тех же целей, но добавить число и символ у вас никогда не получится.
Кавычки:
«Проблема в том, что скрытые приведения типов в выражениях непредсказуемы» — Анонимный «В этом случае JavaScript должен выдать исключение» — crgwbr «+ для конкатенации строк — это кошмар» — Маттео РиваМодули Perl должны возвращать true
Изображение предоставлено Энтони Келли CC BY 2.0 Каждый модуль в Perl должен возвращать true. Если этого не произойдет, то разработчик рискует серьезно испортить себе карму и столкнуться с ошибкой компиляции.
Причина этого ясна и понятна, если вы понимаете, что такое модуль в Perl. Программа компиляции, учитывая подключенные к коду модули, в первую очередь проверяет их выполнение.
Даже если в модуле нет кода инициализации, Perl все равно ожидает вывода True.
Кавычки:
"Эта штука всегда вызывает у меня тошноту" - Дрю Холл «Это не имеет никакой практической пользы, учитывая постоянное раздражение» — ШвернТриграфы в C и C++
Изображение предоставлено REUTERS/Гэри Хершорном Языки C и C++ поддерживают триграфы — трехсимвольные обозначения, которые автоматически преобразуются в односимвольные.
Так, например, сочетание ??! даст тебе |.
Если вы хотите максимально запутать необразованного противника, решившего прочитать ваш код, используйте комбинацию ??( и ??) вместо квадратных скобок.
Смысл триграфов заключается вовсе не в желании разработчиков языка запутать код, а в том, что когда-то многие клавиатуры просто не содержали распространённых сейчас символов, например фигурных скобок.
Кавычки:
«Google не поможет, если вы что-то ищете??!???!» — Исаак «Все так ненавидят триграфы, что C99 предложил им диграфы в качестве альтернативы… еще больше запутывания» — уклоняться «Радость триграфов — C становится нечитабельным с 1977 года» — Мартин БеккетЧувствительность к регистру PHP
Изображение предоставлено Греггом О'Коннеллом CC BY 2.0 Хотя большинство языков программирования чувствительны к регистру, PHP делает имена функций, классов и методов нечувствительными к регистру.
Но что больше всего поражает разработчиков, так это то, что имена переменных, констант и свойств классов по-прежнему чувствительны к регистру.
Доподлинно неизвестно, откуда взялось это несоответствие, но наиболее вероятный вариант — первоначальное желание создателей PHP выделить CGI-интерфейс в отдельный полноценный язык программирования.
Кавычки:
«Ну, это PHP. Не удивляйся" - Гжечуоо «Вот почему программисты PHP используют символы подчеркивания вместо CamelCase при названии своих функций» — Бумажнаяулица7 «Я понятия не имею, как создавать языки программирования…» — создатель PHP Расмус Лердорф «Есть ли что-нибудь в PHP, что не сбивает с толкуЭ» — Лямбда ФеяИстинный ноль в Ruby
Изображение предоставлено DaveBleasdale CC BY 2.0 В Ruby 0 == ИСТИНА.
Это неожиданно, противоречит большинству других языков, включая Python и C, где 0 — это ЛОЖЬ, и часто сбивает с толку новичков Ruby. Причина в том, что в Ruby только логические значения false и nil оцениваются как FALSE; все остальное ПРАВДА.
0 рассматривается как любое другое число.
Кавычки:
«Может быть, было бы странно, если бы я не думал, что это хорошо» — Крис Лутц «Вот почему я люблю Руби.Мне не придется иметь дело с таким нулевым ложным злом».
Эддитория
"0==true // ага, компилятор C в моей голове взорвался!!" — Кенни
Пробелы в Python
Изображение предоставлено Полом Китченером CC BY 2.0 Вместо знаков препинания или ключевых слов Python использует отступы для обозначения блока, которому принадлежит строка кода.
Использование неправильного количества пробелов или смешивание пробелов и табуляции может привести к ошибкам.
Создатели языка стремились сделать код более читабельным и сократить количество нажатий клавиш за счет того, что многие редакторы и IDE автоматически делают отступы.
Кавычки:
«Нет, правда: именно это мешает мне когда-либо полюбить Python».вазокс «Я люблю отступы в Python, но есть нюанс: при копировании и вставке кода из Интернета это часто приводит к необходимости дополнительной очистки».
Грег «Если вам нужны принудительные отступы, вы слишком ленивы» — Дж.
Массивы в C подлежат арифметике указателей.
Изображение предоставлено BlueGum CC BY-ND 2.0
Помимо получения ссылки на элемент массива как a[i], вы можете получить его как i[a].
Причина в том, что массивы в C являются указателями на блоки памяти, поэтому a[i]=*(a+i)=*(i+a)=i[a].
Кавычки:
«.это бесценно, когда вы участвуете в соревновании по запутыванию C.» — Путаница «Я не считаю это особенностью, это просто взгляд на ядро C. Все дело в указателях и максимально быстром доступе к памяти.
В каком-то смысле это красиво».
Предопределенные переменные Perl
Изображение предоставлено Эмили Мэтьюз CC BY 2.0 Если внимательно прочитать описание языка Perl, то можно найти довольно большое количество предопределенных переменных с, мягко говоря, странными именами (правда, у них есть довольно длинный английский эквивалент).
Они служат для предоставления информации или обеспечения доступа к различным аспектам программы.
Так, например, $@ — это сообщение об ошибке, $$ — идентификатор процесса, $^V — используемая версия Perl. Новичкам приходится часто просматривать документацию.
Кавычки:
"Очень надоедливый" - МатрицаЛягушка «Кстати, классная штука для острот» — Никсар «Я думаю, что худшие из них — это $@ и @$.Оба работают, но я до сих пор не знаю, что делает второй.
» — Артем Русаковский
«Кстати, с этими переменными есть еще одна серьезная проблема: они не гуглятся!» — мальвим
Автоматическая вставка точки с запятой в JavaScript
Изображение предоставлено Нейтом Энджеллом CC BY 2.0 JavaScript требует, чтобы точка с запятой ставилась в конце каждого завершенного выражения.
Если этого не было сделано, и за ним следует, скажем, пустая строка, JavaScript расценивает это как невнимательность разработчика и самостоятельно вставляет точку с запятой, что иногда помогает, но часто приводит к ошибкам и неожиданному поведению программы.
Точка с запятой изначально была предназначена для удобства, чтобы упростить синтаксис C-подобного JavaScript для новых разработчиков.
Кавычки:
«У вас определенно возникнут проблемы, если вы разрабатываете язык, предполагая, что ваши пользователи — идиоты».Роб Ван Дам «Совет: найдите, где находится точка с запятой, и поставьте ее туда.
Это лучшее" - Дуг Крокфорд «Вставка точек с запятой — одна из худших частей JavaScript».
Автобокс в Java и целочисленное кэширование
Изображение предоставлено Эрихом Фердинандом CC BY 2.0 Java автоматически оборачивает примитивы в объекты, например int в Integer. В общем, ничего страшного, но Integer кэшируется, если его значение лежит между -128 и 127. Это может привести к неожиданным результатам при сравнении объектов с автоупаковкой, поскольку программа присвоит значение TRUE, если оба объекта имеют значение от -128 до 127. и ЛОЖЬ во всех остальных случаях.
Автобоксинг уменьшает объем кода, а целочисленное кэширование повышает производительность.
Но нужно знать подводные камни.
Кавычки:
«Вот результат преждевременной оптимизации» — Джошуа «Это не распространенная ошибка, но хороший повод использовать собственные типы Java для чисел, логических значений и т. д.» — Рави Валлау «Я так рад, что пишу на C#» — Воля Автор перевода: Илья Бубнов ___ P.S. Вы можете выбрать направление и начать обучение по одной из описанных выше технологий.Теги: #языки программирования #php #python #C++ #C++ #ruby #java #программирование
-
100. С Точным Капитальным Временем!
19 Oct, 24 -
Участие В Юридической Войне
19 Oct, 24 -
Размещение Строк В Параметрах Шаблона
19 Oct, 24