Не баг, а фича: странное поведение языков программирования
Иногда при написании кода можно заметить, что что-то работает не так, как вы ожидали. Дело не в ошибках в коде, а в языках...
25К открытий25К показов
Иногда язык программирования ведёт себя не так, как этого ожидает программист. Перевели для вас подборку забавных фич разных языков.
C/C++
- В языке C можно индексировать массивы следующим образом:
И это очень распространённый способ.
Однако существует и другая, менее известная реализация:
Код означает то же самое, что и пример выше.
Прим. перев. Такой эффект возникает из-за того, что в языке C операция обращения по индексу a[b]
— это синтаксический сахар для *(a + b)
, что, конечно, эквивалентно *(b + a)
и в свою очередь b[a]
.
- Триграф в C и C++:
На экран будет выведено LOL|
без ??!
, так как эти три знака формируют триграф |
.
Прим. перев. Триграфы были удалены в C++17.
- В языке C метки
case
оператораswitch
могут находиться внутри вложенных блоков кода. Ниже приведён пример функцииmemcpy
с использованием этого метода.
Прим. перев. Этот приём известен как «устройство Даффа».
- Для каких странностей могут использоваться шаблоны в C++?
Лучше всего это продемонстрировано в «Многомерных аналоговых Литералах», которые используют шаблоны для вычисления площади нарисованных символами форм. Код ниже действителен для прямоугольника ниже.
Другой пример с кубом:
Java
- В Java следующий код:
Может быть записан таким образом:
- Странное поведение при упаковке целых значений в Java:
После запуска кода в первом случае будет выведено false
, а во втором — true
.
Примечание Объяснение этой особенности языка хорошо описано на Stack Overflow.
PHP
- Как PHP обрабатывает числовые значения в строках:
Язык PHP не любит строки. Он ищет оправдания для того, чтобы рассматривать введённые в строки значения в виде чисел. Измените немного шестнадцатеричные символы, и PHP внезапно решит, что они уже не относятся к строкам — они становятся числами в научном понимании (PHP не важно, что вы использовали кавычки). Значения выше эквивалентны, так как нули перед другими цифрами игнорируются. Чтобы подкрепить это утверждение, давайте глянем на другой пример:
Для PHP эти значения равны, и это задокументированное явление.
JavaScript
- Странности при сложении и вычитании в JavaScript:
Но при этом операция ниже выполняется согласно ожиданиям:
- Таблица «истины» в JavaScript:
- И ещё немного JS напоследок:
Примечание Ещё у нас есть интересная статья о скрытых шутках и возможностях в Python.
А для вас что было самым странным и необычным в языках программирования, с которыми вы работаете?
25К открытий25К показов