Jaka jest, Twoim zdaniem, najbardziej zaskakująca, dziwna, dziwna lub naprawdę „językowa” cecha, z jaką się spotkałeś?
Proszę tylko jedną funkcję na odpowiedź.
language-agnostic
programming-languages
Robert Harvey
źródło
źródło
Odpowiedzi:
W C tablice można indeksować w następujący sposób:
co jest bardzo powszechne.
Jednak mniej znana forma (która naprawdę działa!) To:
co oznacza to samo co powyżej.
źródło
W JavaScript:
Natomiast
źródło
+
bo łączenie strun jest okropneW JavaScript następująca konstrukcja
returnjest błędem składniowym wynikającym z podstępnego niejawnego wstawiania średnika w nowej linii poundefined
return
. Następujące działa jednak tak, jak można się spodziewać:Co gorsza, ten również działa (przynajmniej w Chrome):
Oto wariant tego samego problemu, który nie powoduje błędu składniowego, po prostu po cichu kończy się niepowodzeniem:
źródło
Tabela prawdy JavaScript:
źródło
==
służy w oczach projektanta języka?==
miał znaczenie===
, a wtedy byłby inny operator, coś takiego~=
pozwalało na przymus typu.Trigrafie w C i C ++.
Spowoduje to wydrukowanie
LOL|
, ponieważ kaligraf??!
jest konwertowany na|
.źródło
Zabawa z automatycznym boksem i całkowitą pamięcią podręczną w Javie:
Wyjaśnienie
Szybkie spojrzenie na kod źródłowy Java spowoduje wyświetlenie następujących informacji:
Uwaga: wartość
IntegerCache.high
domyślna to127
chyba, że jest ustawiona przez właściwość.To, co dzieje się z automatycznym bokowaniem, polega na tym, że zarówno foo, jak i słupek tego samego obiektu liczb całkowitych pobranego z pamięci podręcznej, chyba że jest to jawnie utworzone: np.
foo = new Integer(42)
Dlatego, porównując równość referencji, będą one prawdziwe, a nie fałszywe. Stosuje się właściwy sposób porównywania wartości całkowitych.equals;
źródło
Cytując Neila Frasera (spójrz na koniec tej strony),
(w Javie, ale zachowanie jest podobno w JavaScript i Python). Wynik pozostawia się czytelnikowi jako ćwiczenie.
ZMIENIONO: Tak długo, jak zajmujemy się tym tematem, rozważ również to:
źródło
Control cannot leave the body of a finally clause
return
wfinally
klauzuli.APL (oprócz WSZYSTKICH), możliwość napisania dowolnego programu w jednym wierszu.
np . Gra życia Conwaya w jednej linii w APL :
alt text http://catpad.net/michael/APLLife.gif
Jeśli ta linia nie jest WTF, to nic nie jest!
A oto film
źródło
Dziwne rzeczy, do których można wykorzystać szablony C ++, najlepiej pokazane w „Wielowymiarowych literałach analogowych”, które używają szablonów do obliczania obszaru „narysowanych” kształtów. Poniższy kod jest poprawnym C ++ dla prostokąta 3x3
Lub inny przykład z kostką 3D:
źródło
Wiele wbudowanych zmiennych Perla:
$#
- bez komentarza!$0
,$$
i$?
- podobnie jak zmienne powłoki o tej samej nazwie$ˋ
,$&
i$'
- dziwne pasujące zmienne$"
i$,
- dziwne zmienne dla separatorów list i pól wyjściowych$!
- lubićerrno
liczba, alestrerror(errno)
jako ciąg$_
- zmienna Stealth, zawsze i nigdy nie widziałem$#_
- numer indeksu ostatniego argumentu podprogramu ... może@_
- (nie) nazwy bieżącej funkcji ... może$@
- ostatni podniesiony wyjątek%::
- tablica symboli$:
,$^
,$~
,$-
, I$=
- coś zrobić z formatów wyjściowych$.
i$%
- numer linii wejściowej, numer strony wyjściowej$/
i$\
- separatory rekordów wejściowych i wyjściowych$|
- kontroler buforowania wyjścia$[
- zmień bazę macierzy z 0 na 1 na 42: WHEEE!$}
- nic w tym dziwnego!$<
,$>
,$(
,$)
- realne i efektywne UID i GID@ISA
- nazwy bezpośrednich nadklas bieżącego pakietu$^T
- czas uruchomienia skryptu w epokach sekund$^O
- aktualna nazwa systemu operacyjnego$^V
- jaka to wersja PerlaTam jest o wiele więcej. Przeczytaj pełną listę tutaj .
źródło
$[
Zmienna jest najbardziej zło z nich wszystkich.perldoc perlvar
co pięć sekund. (Chociaż przyznaję się, że przez pół czasu sprawdzam to, myśląc: „Wiem, że istnieje specjalna zmienna, która może to dla mnie zrobić, ale po prostu nie pamiętam, która ...” = P)use English;
polega na tym, że wpływa to na wydajność RegExp. Nie wymyślam tego. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
, jest[bar]
częścią klasy znak lub indeks do tablicy@foo
? Grep perldata za przerażającą odpowiedź.Obsługa wartości liczbowych w łańcuchach przez PHP . Zobacz poprzednią odpowiedź na inne pytanie, aby uzyskać szczegółowe informacje, ale w skrócie:
Jeśli masz dwa ciągi znaków, które zawierają inną liczbę znaków, nie można ich uznać za równe. Zera wiodące są ważne, ponieważ są to ciągi, a nie liczby.
PHP nie lubi napisów. Poszukuje jakiejkolwiek wymówki, by traktować swoje wartości jak liczby. Zmień nieznacznie znaki szesnastkowe w tych ciągach i nagle PHP decyduje, że to już nie są ciągi, są to liczby w notacji naukowej (PHP nie obchodzi, że użyłeś cudzysłowów) i są one równoważne, ponieważ zera są ignorowane dla liczb. Aby wzmocnić ten punkt, przekonasz się, że PHP również ocenia
"01e4" == "10000"
jako prawdziwe, ponieważ są to liczby o równoważnych wartościach. Jest to udokumentowane zachowanie, po prostu nie jest zbyt rozsądne.źródło
Głosujmy na wszystkie języki (takie jak PL / I), które próbowały pozbyć się słów zastrzeżonych.
Gdzie indziej możesz napisać takie zabawne wyrażenia, jak:
(
IF
,THEN
,ELSE
Są nazwy zmiennych)lub
(
IF
jest zmiennąTHEN
iELSE
są podprogramami)źródło
„Funkcja” konwersji ósemkowej JavaScript jest dobra, o której warto wiedzieć:
Więcej informacji tutaj .
źródło
Urządzenie Duffa w C!
W C można przeplatać instrukcję do / while z instrukcją switch. Oto przykład memcpy przy użyciu tej metody:
źródło
while
na końcu jest (warunkowy)JMP
powrót dodo
, co wyjaśnia, dlaczego możesz pominąćdo
i nadal kończyć w pętli.Algol podaje nazwę (ilustrowane składnią C):
źródło
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]; } }); }
?W Pythonie:
Nie WTF, ale przydatna funkcja.
źródło
(10 > 5 > 1) != ((10 > 5) > 1)
w Pythonie.(funct_a(5)+5 > b > funct_a(5))
dzwoni tylkofunct_a(5)
raz. To WIELKA funkcja!funct_a
w tym przykładzie zostanie wywołany dwukrotnie. Wb > funct_a(5) > c
zostanie wywołana tylko raz, choć w przeciwieństwie dob > funct_a(5) and funct_a(5) > c
.W Javie:
Można zapisać jako:
źródło
const T*
iT const*
są one równoważne, to właśnieT* const
stanowi wskaźnik. Poza tym nienawidzę czcionek sans.numbers()[2]
jest to oświadczenie prawne.INTERCAL jest prawdopodobnie najlepszym kompendium najdziwniejszych funkcji językowych. Moim osobistym faworytem jest instrukcja COMEFROM , która jest (prawie) przeciwieństwem GOTO.
źródło
PLEASE
modyfikatora wystarczająco często!Naprawdę nie jest to funkcja językowa, ale wada implementacji: Niektóre wczesne kompilatory Fortran zaimplementowały stałe za pomocą stałej puli. Wszystkie parametry zostały przekazane przez odniesienie. Jeśli wywołałeś funkcję, np
Kompilator przekaże adres funkcji 1 w stałej puli do funkcji. Jeśli przypisałeś wartość do parametru w funkcji, zmieniłbyś wartość (w tym przypadku wartość 1) globalnie w programie. Spowodowało to drapanie głowy.
źródło
2+2
może być równy5
(2
oczywiście dla bardzo dużych wartości !).2+2
byłoby to równe5
dla małych wartości5
).2 + 2 = 5
; to będzie błąd składniowy. To, co będzie prawdą, jest2 + 2 .EQ. 5
.Nie wiem, czy można to uznać za funkcję języka, ale w C ++ prawie każdy błąd kompilatora związany z szablonami dostarcza sporo WTF do wielu programistów C ++ na całym świecie :)
źródło
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> >)
Wiele przestrzeni nazw C:
Lub z postaciami:
źródło
Powiedziałbym, że cała spacja w Pythonie jest moją największą funkcją WTF. To prawda, że mniej więcej przyzwyczajasz się do tego po chwili, a nowoczesne edytory ułatwiają radzenie sobie z nim, ale nawet po przeważnie pełnoetatowym rozwoju Pythona w ubiegłym roku wciąż jestem przekonany, że to zły pomysł. Przeczytałem wszystkie uzasadnienia, ale szczerze mówiąc, przeszkadza to w mojej produktywności. Niewiele, ale wciąż jest zadzior pod siodłem.
edycja: sądząc po komentarzach, niektórzy ludzie myślą, że nie lubię wciskać mojego kodu. To błędna ocena. Zawsze wciskałem swój kod bez względu na język i to, czy jestem do tego zmuszony. Nie podoba mi się to, że to wcięcie określa, w którym bloku znajduje się wiersz kodu. Wolę do tego wyraźne ograniczniki. Między innymi uważam, że wyraźne ograniczniki ułatwiają wycinanie i wklejanie kodu.
Na przykład, jeśli mam blok z wcięciem 4 spacje i wklejam go na końcu bloku, który ma wcięcie 8 spacji, mój edytor (wszyscy redaktorzy?) Nie ma pojęcia, czy wklejony kod należy do bloku 8-spacji czy zewnętrznego blok. OTOH, jeśli mam wyraźne ograniczniki, oczywiste jest, do którego bloku należy kod i jak należy go (ponownie) wciąć - robi to inteligentnie szukając ograniczników bloków.
edycja 2: niektórzy ludzie, którzy komentują, wydają się sądzić, że jest to funkcja, której nienawidzę lub że sprawia, że Python jest słabym językiem. Ponownie nieprawda. Chociaż nie lubię tego aż tak bardzo, to nie ma sensu. Pytanie dotyczy najdziwniejszej funkcji językowej i myślę, że jest to dziwne, ponieważ jest to coś bardzo, bardzo niewielu (ale> 0) języków.
źródło
Trochę o to walczyłem:
W Perlu moduły muszą zwrócić coś prawdziwego .
źródło
'Cogito ergo sum';
co, jak wszyscy wiedzą, jest oczywiste we wszystkich możliwych wszechświatach. Zapewnia to maksymalną przenośność”.<?=1;?>
zwraca 1.<?=true;?>
zwraca 1.<?=false;?>
zwraca null.Dziwi mnie, że nikt nie wspominał o 7 konstrukcjach pętli Visual Basic .
Ponieważ trzymanie! przed swoim warunkowym sposób zbyt skomplikowane!
źródło
While
iWhend
”, ponieważ są ludzie, którzy wymawiają słowo „podczas” z bezdźwięcznym labializowanym przybliżeniem welarowym. I oczywiście ładniej się układa, a kod, który się układa jest fajny.Dla tych, którzy nie wiedzą,
bc
jest „językiem kalkulatora o dowolnej precyzji” i używam go dość często do szybkich obliczeń, szczególnie gdy liczby są duże ($
pojawia się monit):bc
jest standardowym poleceniem uniksowym .Teraz „funkcja WTF”. To jest z
man bc
(moje podkreślenie):źródło
bc
i chciałem pisać o tymbc
w moim poście ze względu na świetne cytaty ze strony man.echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(chociaż możesz już to wiedzieć).Zawsze zastanawiałem się, dlaczego najprostszym programem było:
Może to być:
Może przede wszystkim to przeraża studentów informatyki ...
źródło
JavaScript jest zorientowany obiektowo, prawda? Dlatego uruchamianie metod na literalnych ciągach i liczbach powinno działać. Lubię
"hello".toUpperCase()
i3.toString()
. Okazuje się, że drugi to błąd składniowy, dlaczego? Ponieważ analizator oczekuje, że liczba, po której następuje kropka, będzie literałem zmiennoprzecinkowym. To nie jest WTF, WTF polega na tym, że musisz tylko dodać kolejną kropkę, aby działało:Powodem jest to, że dosłowność
3.
jest interpretowana jako3.0
i3.0.toString()
działa dobrze.źródło
3..__add__(4)
). Z drugiej strony uważam, że(3).__add__(4)
jest to sposób na znacznie mniej uszkodzony mózg :)3.0.toString()
swędzi mnie oczy.W JavaScript:
Na szczęście mili ludzie ze stackoverflow.com wyjaśniali mi wszystko: dlaczego 2 == [2] w JavaScript?
źródło
===
zamiast tego.Number(n)
do zrobienia czegoś podobnego. Niestety w obu naszych rozwiązaniach===
przerwy = (.Moją największą nienawidzoną funkcją jest dowolna składnia pliku konfiguracyjnego, która zawiera logikę warunkową. Tego rodzaju rzeczy są powszechne w świecie Java (Ant, Maven itp. Wiesz, kim jesteś!).
Po prostu kończysz programowanie w języku ac ** p, z ograniczonym debugowaniem i ograniczoną obsługą edytora.
Jeśli potrzebujesz logiki w swojej konfiguracji, podejście w języku Python do kodowania konfiguracji w prawdziwym języku jest znacznie lepsze.
źródło
powerbasic (www.powerbasic.com) zawiera dyrektywę kompilatora:
zwiększa to rozmiar skompilowanego pliku wykonywalnego o
<bloatsize>
bajty. zostało to umieszczone w kompilatorze na wypadek, gdyby ludzie tworzący plik wykonywalny nie lubili niewielkiego rozmiaru generowanego pliku wykonywalnego. sprawia, że EXE wydaje się większy, aby konkurować z rozdętymi językami programowania :)źródło