Какая, на ваш взгляд, самая удивительная, странная, странная или действительно "WTF" языковая функция, с которой вы столкнулись?
Пожалуйста, только одна функция в ответе.
language-agnostic
programming-languages
Роберт Харви
источник
источник
Ответы:
В C массивы могут быть проиндексированы следующим образом:
что очень распространено.
Тем не менее, менее известная форма (которая действительно работает!):
что означает то же самое, что и выше.
источник
В JavaScript:
В то время как
источник
+
для конкатенации строк ужасноВ JavaScript следующая конструкция
returnявляется синтаксической ошибкой из-за хитрой неявной вставки точек с запятой на новой строке послеundefined
return
. Следующее работает, как вы ожидаете, хотя:Еще хуже, этот работает также (по крайней мере, в Chrome):
Вот вариант той же проблемы, который не приводит к синтаксической ошибке, просто молча терпит неудачу:
источник
Таблица истинности JavaScript:
источник
==
служит в глазах языкового дизайнера?==
имел значение===
, а затем был еще один оператор, что-то вроде~=
этого позволяло приведение типов.Триграфы в C и C ++.
Это напечатает
LOL|
, потому что триграф??!
преобразован в|
.источник
Удовольствие от автоматического бокса и целочисленного кэша в Java:
объяснение
Быстрый взгляд на исходный код Java покажет следующее:
Примечание: по
IntegerCache.high
умолчанию,127
если не установлено свойством.Что происходит с автобоксом, так это то, что foo и bar одинакового целочисленного объекта извлекаются из кэша, если не созданы явно: например
foo = new Integer(42)
, при сравнении равенства ссылок они будут истинными, а не ложными. Правильный способ сравнения целочисленного значения использует.equals;
источник
Цитируя Нила Фрейзера (смотрите в конце этой страницы),
(в Java, но поведение, очевидно, одинаково в JavaScript и Python). Результат оставлен читателю в качестве упражнения.
РЕДАКТИРОВАНИЕ: Пока мы находимся на предмете, рассмотрите также это:
источник
Control cannot leave the body of a finally clause
return
вfinally
пункт.APL (кроме ВСЕГО), возможность написать любую программу в одну строку.
например , игра жизни Конвея в одной строке в APL :
альтернативный текст http://catpad.net/michael/APLLife.gif
Если эта строка не WTF, то ничего нет!
А вот и видео
источник
Можно использовать странные шаблоны C ++, лучше всего демонстрируемые «Многомерными аналоговыми литералами», которые используют шаблоны для вычисления площади «нарисованных» фигур. Следующий код является допустимым C ++ для прямоугольника 3x3
Или другой пример с трехмерным кубом:
источник
Много встроенных переменных Perl:
$#
- не комментарий!$0
,$$
и$?
- так же, как переменные оболочки с тем же именем$ˋ
,$&
И$'
- странные сопоставления переменных$"
и$,
- странные переменные для разделителей списков и выходных полей$!
- какerrno
число, ноstrerror(errno)
как строка$_
- стелс переменной, всегда и никогда не видел$#_
- порядковый номер последнего аргумента подпрограммы ... возможно@_
- (не) имена текущей функции ... возможно$@
- последнее возбужденное исключение%::
- таблица символов$:
,$^
,$~
,$-
, И$=
- что - то делать с выходными форматами$.
и$%
- номер строки ввода, номер страницы вывода$/
и$\
- разделители входных и выходных записей$|
- контроллер буферизации вывода$[
- измените базу массива с 0 на 1 на 42: WHEEE!$}
- вообще ничего, как ни странно!$<
,$>
,$(
,$)
- реальные и эффективные UI и ГИД@ISA
- имена прямых суперклассов текущего пакета$^T
- время запуска скрипта в секундах эпохи$^O
- текущее имя операционной системы$^V
- что это за версия PerlТам намного больше, откуда они пришли. Читайте полный список здесь .
источник
$[
Переменная является самым злым из всех.perldoc perlvar
каждые пять секунд. (Хотя я признаюсь, что половину времени я проверяю это, думая: «Я знаю, что есть специальная переменная, которая может сделать это для меня, я просто не помню, какая из них ...» = P)use English;
том, что это влияет на производительность RegExp. Я не придумываю это. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
, является ли[bar]
часть символьным классом или индексом массива@foo
? Grep Perldata за ужасающий ответ.PHP обрабатывает числовые значения в строках . Смотрите этот предыдущий ответ на другой вопрос для более подробной информации, но, вкратце:
Если у вас есть две строки, содержащие разное количество символов, их нельзя считать равными. Ведущие нули важны, потому что это строки, а не числа.
PHP не любит строки. Он ищет любое оправдание, которое может найти ваши значения как числа. Немного измените шестнадцатеричные символы в этих строках, и вдруг PHP решит, что это уже не строки, это числа в научной нотации (PHP не заботится о том, что вы использовали кавычки), и они эквивалентны, так как начальные нули игнорируются для чисел. Чтобы подтвердить это, вы обнаружите, что PHP также оценивается
"01e4" == "10000"
как true, потому что это числа с эквивалентными значениями. Это документированное поведение, просто оно не очень разумно.источник
Давайте проголосуем за все языки (такие как PL / I), которые пытались избавиться от зарезервированных слов.
Где еще вы могли бы легально написать такие забавные выражения, как:
(
IF
,THEN
,ELSE
Являются имена переменных)или
(
IF
является переменной,THEN
иELSE
подпрограммы)источник
Полезно знать о «восьмеричном» преобразовании JavaScript:
Подробнее здесь .
источник
Устройство Даффа в C!
В C можно сделать do / while с помощью оператора switch. Вот пример memcpy, использующего этот метод:
источник
while
в конце (условный)JMP
возврат кdo
, что объясняет, почему вы можете пропуститьdo
и все же оказаться в цикле.Алгол, передаваемый по имени (показано с использованием синтаксиса C):
источник
def f(j : => int)
)... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }
?В Python:
Не WTF, но полезная функция.
источник
(10 > 5 > 1) != ((10 > 5) > 1)
в Python.(funct_a(5)+5 > b > funct_a(5))
звонит толькоfunct_a(5)
один раз. Это отличная особенность!funct_a
в этом примере будет вызываться дважды. Вb > funct_a(5) > c
это будет вызван только один раз, в отличие отb > funct_a(5) and funct_a(5) > c
.В Java:
Может быть написано как:
источник
const T*
иT const*
это эквивалентно, этоT* const
указатель. Кроме того, я ненавижу без шрифтов.numbers()[2]
это юридическое заявление.INTERCAL , вероятно, лучший сборник самых странных языковых возможностей. Мой личный фаворит - это утверждение COMEFROM, которое (почти) противоположно GOTO.
источник
PLEASE
модификатор достаточно часто!Не совсем языковая особенность, но недостаток реализации: некоторые ранние компиляторы Фортрана реализовывали константы, используя постоянный пул. Все параметры были переданы по ссылке. Если вы вызвали функцию, например
Компилятор передал бы адрес константы 1 в пуле констант функции. Если вы присвоили значение параметру в функции, вы изменили бы значение (в данном случае значение 1) глобально в программе. Вызвало некоторые царапины на голове.
источник
2+2
может равняться5
(для очень больших значений2
конечно!).2+2
будет равно5
для небольших значений5
).2 + 2 = 5
; это будет синтаксическая ошибка. Что будет верно это2 + 2 .EQ. 5
.Не знаю, можно ли это считать языковой функцией, но в C ++ практически любая ошибка компилятора, связанная с шаблонами, ежедневно доставляет немало WTF многим программистам C ++ по всему миру :)
источник
std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
Много пространств имен C:
Или с персонажами:
источник
Я бы сказал, что вся штука с пробелами в Python - моя лучшая особенность WTF. Правда, через некоторое время вы более или менее привыкаете к этому, и современные редакторы позволяют легко с этим справляться, но даже после большей части разработки Python в течение полного года я все еще убежден, что это плохая идея. Я прочитал все причины этого, но, честно говоря, это мешает моей производительности. Не очень, но это все еще заусенец под седлом.
редактировать: судя по комментариям, некоторые люди думают, что я не люблю делать отступы в своем коде. Это неверная оценка. Я всегда смещал свой код независимо от того, на каком языке и был ли я вынужден или нет. Что мне не нравится, так это то, что именно отступ определяет блок, в котором находится строка кода. Я предпочитаю для этого явные разделители. Среди прочих причин я обнаружил, что явные разделители облегчают вырезание и вставку кода.
Например, если у меня есть блок с отступом 4 пробела и вставьте его в конец блока с отступом 8 пробелов, мой редактор (все редакторы?) Понятия не имеет, принадлежит ли вставленный код блоку из 8 пробелов или внешнему блок. OTOH, если у меня есть явные разделители, становится очевидным, к какому блоку принадлежит код и как он должен (пере) отступаться - это происходит благодаря интеллектуальному поиску разделителей блоков.
редактировать 2: некоторые люди, которые предоставляют комментарии, кажется, думают, что это функция, которую я ненавижу или которая, я думаю, делает Python плохим языком. Опять не правда. Хотя мне это не очень нравится, это не относится к делу. Вопрос о странной языковой функции, и я думаю, что это странно, потому что она используется очень, очень немногими (но> 0) языками.
источник
Я немного боролся по этому поводу:
В Perl модули должны возвращать что-то истинное .
источник
'Cogito ergo sum';
что, как всем известно, самоочевидно верно во всех возможных вселенных. Это обеспечивает максимальную переносимость».<?=1;?>
возвращает 1.<?=true;?>
возвращает 1.<?=false;?>
возвращает ноль.Я удивлен, что никто не упомянул 7 циклических конструкций Visual Basic .
Потому что наклеить! перед вашим Conditional является способом слишком сложно!
источник
While
иWhend
», поскольку есть некоторые люди, которые произносят слово «пока» с глухим лабиализированным приближением велярного. И, конечно, он выстраивается лучше, и код, который выстраивается, хорош.Для тех, кто не знает,
bc
это «язык калькулятора произвольной точности», и я использую его довольно часто для быстрых вычислений, особенно когда задействованные числа являются большими ($
подсказка):bc
долгое время была стандартной командой Unix .Теперь о «функции WTF». Это из
man bc
(выделение мое):источник
bc
это и хотел написатьbc
в своем посте из-за замечательных цитат из справочной страницы.echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(хотя вы, возможно, уже знаете это).Я всегда задавался вопросом, почему самая простая программа была:
Тогда как это может быть:
Может быть, это пугает студентов по информатике в первую очередь ...
источник
JavaScript является объектно-ориентированным, верно? Таким образом, методы работы на литеральных строках и числах должны работать. Вроде
"hello".toUpperCase()
и3.toString()
. Оказывается, что вторая ошибка синтаксиса, почему? Поскольку синтаксический анализатор ожидает, что число, сопровождаемое точкой, является литералом с плавающей запятой. Это не WTF, WTF в том, что вам нужно только добавить еще одну точку, чтобы она заработала:Причина в том, что литерал
3.
интерпретируется как3.0
и3.0.toString()
работает нормально.источник
3..__add__(4)
). Опять же, я думаю, что(3).__add__(4)
это гораздо менее поврежденный мозг способ сделать это :)3.0.toString()
Зудит мои глаза.В JavaScript:
К счастью, добрые ребята из stackoverflow.com объяснили мне все это: почему 2 == [2] в JavaScript?
источник
===
вместо этого.Number(n)
чтобы сделать что-то подобное. К сожалению в обоих наших решениях===
перерывы = (.Моя самая большая ненавистная особенность - любой синтаксис файла конфигурации, который включает условную логику. Подобные вещи распространены в мире Java (Ant, Maven и т. Д. Вы знаете, кто вы есть!).
Вы просто заканчиваете программирование на ac ** p языке, с ограниченной отладкой и ограниченной поддержкой редактора.
Если вам нужна логика в вашей конфигурации, «Pythonic» подход кодирования конфигурации на реальном языке будет намного лучше.
источник
powerbasic (www.powerbasic.com) включает директиву компилятора:
это увеличивает размер скомпилированного исполняемого файла в
<bloatsize>
байтах. это было помещено в компилятор на тот случай, если людям, создающим исполняемый файл, не нравится маленький размер сгенерированного исполняемого файла. это заставляет EXE казаться больше, чтобы конкурировать с раздутыми языками программирования :)источник