Was ist Ihrer Meinung nach das überraschendste, seltsamste, seltsamste oder wirklich "WTF" -Sprachenmerkmal, auf das Sie gestoßen sind?
Bitte nur eine Funktion pro Antwort.
language-agnostic
programming-languages
Robert Harvey
quelle
quelle
Antworten:
In C können Arrays folgendermaßen indiziert werden:
das ist sehr häufig.
Die weniger bekannte Form (die wirklich funktioniert!) Ist jedoch:
was das gleiche wie oben bedeutet.
quelle
In JavaScript:
Wohingegen
quelle
+
für String-Verkettung ist schrecklichIn JavaScript das folgende Konstrukt
returnist ein Syntaxfehler aufgrund der hinterhältigen impliziten Einfügung von Semikolons in die neue Zeile danachundefined
return
. Folgendes funktioniert jedoch wie erwartet:Schlimmer noch, dieses funktioniert auch (zumindest in Chrome):
Hier ist eine Variante desselben Problems, die keinen Syntaxfehler verursacht, sondern nur stillschweigend fehlschlägt:
quelle
JavaScript-Wahrheitstabelle:
quelle
==
der Sprachdesigner?==
es die Bedeutung von hätte===
, und dann gab es einen anderen Operator, so etwas~=
erlaubte Typenzwang.Trigraphen in C und C ++.
Dies wird gedruckt
LOL|
, da der Trigraph??!
in konvertiert wird|
.quelle
Spaß mit Auto-Boxing und dem Integer-Cache in Java:
Erläuterung
Ein kurzer Blick auf den Java-Quellcode zeigt Folgendes:
Hinweis: Der
IntegerCache.high
Standardwert ist,127
sofern nicht durch eine Eigenschaft festgelegt.Was beim automatischen Boxen passiert, ist, dass sowohl foo als auch bar dasselbe ganzzahlige Objekt aus dem Cache abrufen, sofern es nicht explizit erstellt wurde:
foo = new Integer(42)
Wenn Sie also beispielsweise die Referenzgleichheit vergleichen, sind sie eher wahr als falsch. Die richtige Methode zum Vergleichen des Integer-Werts ist die Verwendung.equals;
quelle
Zitat von Neil Fraser (siehe Ende dieser Seite),
(In Java ist das Verhalten in JavaScript und Python anscheinend gleich). Das Ergebnis bleibt dem Leser als Übung überlassen.
EDITIERT: Solange wir uns mit dem Thema befassen, bedenken Sie auch Folgendes:
quelle
Control cannot leave the body of a finally clause
return
infinally
Klausel.APL (außer ALLES), die Fähigkeit, jedes Programm in nur einer Zeile zu schreiben.
zB Conways Spiel des Lebens in einer Zeile in APL :
Alternativtext http://catpad.net/michael/APLLife.gif
Wenn diese Zeile nicht WTF ist, dann ist nichts!
Und hier ist ein Video
quelle
Die seltsamen Dinge, für die C ++ - Vorlagen verwendet werden können, werden am besten durch "Multi-Dimensional Analog Literals" demonstriert, die Vorlagen verwenden, um den Bereich "gezeichneter" Formen zu berechnen. Der folgende Code ist in C ++ für ein 3x3-Rechteck gültig
Oder ein anderes Beispiel mit einem 3D-Würfel:
quelle
Perls viele integrierte Variablen:
$#
- kein Kommentar!$0
,,$$
und$?
- genau wie die gleichnamigen Shell-Variablen$ˋ
,$&
Und$'
- seltsam passende Variablen$"
und$,
- seltsame Variablen für Listen- und Ausgabefeldtrennzeichen$!
- wieerrno
als Zahl, aberstrerror(errno)
als Zeichenfolge$_
- die Stealth-Variable, immer verwendet und nie gesehen$#_
- Indexnummer des letzten Unterprogrammarguments ... vielleicht@_
- die (Nicht-) Namen der aktuellen Funktion ... vielleicht$@
- die letzte Ausnahme%::
- die Symboltabelle$:
,$^
,$~
,$-
, Und$=
- etwas mit Ausgabeformaten zu tun$.
und$%
- Eingabezeilennummer, Ausgabeseitennummer$/
und$\
- Trennzeichen für Eingabe- und Ausgabedatensätze$|
- Ausgangspufferregler$[
- Ändern Sie Ihre Array-Basis von 0-basiert auf 1-basiert auf 42-basiert: WHEEE!$}
- Seltsamerweise gar nichts!$<
,$>
,$(
,$)
- reale und effektive UIDs und GIDs@ISA
- Namen der direkten Superklassen des aktuellen Pakets$^T
- Startzeit des Skripts in Sekunden$^O
- aktueller Name des Betriebssystems$^V
- Welche Version von Perl ist das?Es gibt noch viel mehr, woher diese kamen. Lesen Sie die komplette Liste hier .
quelle
$[
Variable ist die böseste von allen.perldoc perlvar
alle fünf Sekunden nachsehen zu müssen. (Obwohl ich gestehe, dass ich die Hälfte der Zeit, in der ich es überprüfe, denke: "Ich weiß, dass es eine spezielle Variable gibt, die dies für mich tun kann, ich erinnere mich nur nicht, welche ..." = P)use English;
ist, dass es die RegExp-Leistung beeinträchtigt. Ich mache das nicht nach. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
der[bar]
Teil beispielsweise eine Zeichenklasse oder ein Index des Arrays@foo
? Grep perldata für die erschreckende Antwort.PHPs Umgang mit numerischen Werten in Strings . In dieser vorherigen Antwort auf eine andere Frage finden Sie ausführliche Informationen, aber kurz gesagt:
Wenn Sie zwei Zeichenfolgen haben, die eine unterschiedliche Anzahl von Zeichen enthalten, können diese nicht als gleich angesehen werden. Die führenden Nullen sind wichtig, da dies Zeichenfolgen und keine Zahlen sind.
PHP mag keine Strings. Es sucht nach einer Entschuldigung, die es finden kann, um Ihre Werte als Zahlen zu behandeln. Ändern Sie die hexadezimalen Zeichen in diesen Zeichenfolgen geringfügig, und plötzlich entscheidet PHP, dass dies keine Zeichenfolgen mehr sind. Es handelt sich um Zahlen in wissenschaftlicher Notation (PHP kümmert sich nicht darum, dass Sie Anführungszeichen verwenden), und sie sind äquivalent, da führende Nullen für Zahlen ignoriert werden. Um diesen Punkt zu verstärken, werden Sie feststellen, dass PHP auch
"01e4" == "10000"
als wahr ausgewertet wird , da dies Zahlen mit äquivalenten Werten sind. Dies ist dokumentiertes Verhalten, es ist einfach nicht sehr sinnvoll.quelle
Lassen Sie uns für alle Sprachen (wie PL / I) abstimmen, die versucht haben, reservierte Wörter zu beseitigen.
Wo sonst könnten Sie legal so amüsante Ausdrücke schreiben wie:
(
IF
,THEN
,ELSE
Sind Variablennamen)oder
(
IF
ist eine VariableTHEN
undELSE
sind Unterprogramme)quelle
Die Funktion zur oktalen JavaScript-Konvertierung ist gut zu kennen:
Weitere Details hier .
quelle
Duffs Gerät in C!
In C kann man ein do / while mit einer switch-Anweisung verschachteln. Hier ein Beispiel für ein Memcpy mit dieser Methode:
quelle
while
am Ende ist ein (bedingtes)JMP
Zurück zumdo
, was erklärt, warum Sie das überspringen könnendo
und trotzdem in der Schleife landen.Algol-Pass-by-Name (dargestellt mit C-Syntax):
quelle
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]; } }); }
?In Python:
Kein WTF, aber eine nützliche Funktion.
quelle
(10 > 5 > 1) != ((10 > 5) > 1)
in Python.(funct_a(5)+5 > b > funct_a(5))
nurfunct_a(5)
einmal aufgerufen wird. Es ist eine großartige Funktion!funct_a
wird in diesem Beispiel zweimal aufgerufen. In wirdb > funct_a(5) > c
es aber nur einmal aufgerufen, im Gegensatz zub > funct_a(5) and funct_a(5) > c
.In Java:
Kann geschrieben werden als:
quelle
const T*
undT const*
äquivalent, es ist dasT* const
, was den Zeiger konstituiert. Außerdem hasse ich ohne Schriftarten.numbers()[2]
ist eine rechtliche Erklärung.INTERCAL ist wahrscheinlich das beste Kompendium der seltsamsten Sprachfunktionen. Mein persönlicher Favorit ist das COMEFROM Aussage, die (fast) das Gegenteil von GOTO ist.
quelle
PLEASE
Modifikator nicht oft genug verwenden!Nicht wirklich eine Sprachfunktion, aber ein Implementierungsfehler: Einige frühe Fortran-Compiler implementierten Konstanten mithilfe eines konstanten Pools. Alle Parameter wurden als Referenz übergeben. Wenn Sie eine Funktion aufgerufen haben, z
Der Compiler würde die Adresse der Konstante 1 im Konstantenpool an die Funktion übergeben. Wenn Sie dem Parameter in der Funktion einen Wert zugewiesen haben, würden Sie den Wert (in diesem Fall den Wert 1) global im Programm ändern. Verursachte einige Kopfkratzer.
quelle
2+2
kann gleich sein5
(für sehr große Werte2
natürlich!).2+2
würde also5
für kleine Werte von gleich sein5
).2 + 2 = 5
; Das ist ein Syntaxfehler. Was wahr sein wird, ist2 + 2 .EQ. 5
.Ich weiß nicht, ob es als Sprachfunktion angesehen werden kann, aber in C ++ liefert fast jeder Compilerfehler in Bezug auf Vorlagen täglich eine ganze Menge WTF an viele C ++ - Programmierer auf der ganzen Welt :)
quelle
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> >)
Die vielen Namensräume von C:
Oder mit Charakteren:
quelle
Ich würde sagen, das ganze Whitespace-Ding von Python ist mein größtes WTF-Feature. Zwar gewöhnt man sich nach einer Weile mehr oder weniger daran und moderne Redakteure machen es einfach, damit umzugehen, aber selbst nach der größtenteils Vollzeit-Python-Entwicklung im vergangenen Jahr bin ich immer noch davon überzeugt, dass es eine schlechte Idee war. Ich habe alle Gründe dafür gelesen, aber ehrlich gesagt beeinträchtigt dies meine Produktivität. Nicht viel, aber es ist immer noch ein Grat unter dem Sattel.
edit: Nach den Kommentaren zu urteilen, scheinen einige Leute zu denken, dass ich meinen Code nicht gerne einrücken möchte. Das ist eine falsche Einschätzung. Ich habe meinen Code immer eingerückt, egal in welcher Sprache und ob ich dazu gezwungen bin oder nicht. Was ich nicht mag, ist, dass es der Einzug ist, der definiert, in welchem Block sich eine Codezeile befindet. Ich bevorzuge explizite Trennzeichen dafür. Unter anderem finde ich, dass explizite Trennzeichen das Ausschneiden und Einfügen von Code erleichtern.
Wenn ich beispielsweise einen Block mit 4 Leerzeichen eingerückt und am Ende eines Blocks mit 8 Leerzeichen eingerückt habe, hat mein Editor (alle Editoren?) Keine Ahnung, ob der eingefügte Code zum 8-Leerzeichen-Block oder zum äußeren gehört Block. OTOH, wenn ich explizite Trennzeichen habe, ist es offensichtlich, zu welchem Block der Code gehört und wie er (neu) eingerückt werden sollte - dies geschieht durch intelligente Suche nach Blocktrennzeichen.
edit 2: Einige Leute, die Kommentare abgeben, scheinen zu glauben, dass dies eine Funktion ist, die ich hasse oder die Python meiner Meinung nach zu einer schlechten Sprache macht. Wieder nicht wahr. Ich mag es zwar nicht so sehr, aber das ist nebensächlich. Die Frage bezieht sich auf das seltsamste Sprachmerkmal, und ich finde das seltsam, da es sehr, sehr wenige (aber> 0) Sprachen verwenden.
quelle
Ich hatte ein bisschen Probleme damit:
In Perl müssen Module etwas Wahres zurückgeben .
quelle
'Cogito ergo sum';
was bekanntlich in allen möglichen Universen selbstverständlich ist. Dies gewährleistet maximale Portabilität."<?=1;?>
gibt 1<?=true;?>
zurück<?=false;?>
. Gibt 1 zurück. Gibt null zurück.Ich bin überrascht, dass niemand die 7- Schleifen-Konstrukte von Visual Basic erwähnt hat .
Weil ein! vor Ihrer Bedingung ist viel zu kompliziert!
quelle
While
undWhend
" schaffen sollen, da es einige Leute gibt, die das Wort "während" mit dem stimmlosen labialisierten Velar-Approximanten aussprechen. Und natürlich ist es besser in einer Reihe, und der Code, der in einer Reihe steht, ist schön.Für diejenigen, die nicht wissen,
bc
ist es eine "willkürliche Präzisionsrechnersprache", und ich benutze sie ziemlich oft für schnelle Berechnungen, insbesondere wenn die beteiligten Zahlen groß sind ($
ist die Eingabeaufforderung):bc
ist seit langem ein Standard-Unix-Befehl .Nun zur "WTF-Funktion". Das ist von
man bc
(Schwerpunkt meiner):quelle
bc
und wolltebc
wegen der tollen Zitate auf der Manpage in meinem Beitrag darüber schreiben .echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(obwohl du das vielleicht schon weißt).Ich habe mich immer gefragt, warum das einfachste Programm ist:
Während es sein könnte:
Vielleicht, um Informatikstudenten überhaupt zu erschrecken ...
quelle
JavaScript ist objektorientiert, oder? Daher sollten Ausführungsmethoden für Literalzeichenfolgen und -zahlen funktionieren. Wie
"hello".toUpperCase()
und3.toString()
. Es stellt sich heraus, dass der zweite ein Syntaxfehler ist. Warum? Weil der Parser erwartet, dass eine Zahl gefolgt von einem Punkt ein Gleitkomma-Literal ist. Das ist nicht die WTF, die WTF ist, dass Sie nur einen weiteren Punkt hinzufügen müssen, damit es funktioniert:Der Grund ist, dass das Literal
3.
als interpretiert3.0
wird und gut3.0.toString()
funktioniert.quelle
3..__add__(4)
).(3).__add__(4)
3.0.toString()
macht meine Augen jucken.In JavaScript:
Zum Glück haben mir die freundlichen Leute von stackoverflow.com das Ganze erklärt: Warum ist 2 == [2] in JavaScript?
quelle
===
stattdessen verwenden.Number(n)
etwas Ähnliches tun. Leider in beiden unserer Lösungen===
Pausen = (.Meine am meisten gehasste Funktion ist die Syntax einer Konfigurationsdatei, die bedingte Logik enthält. Diese Art von Dingen ist in der Java-Welt weit verbreitet (Ant, Maven usw. Sie wissen, wer Sie sind!).
Am Ende programmieren Sie nur in der Sprache ac ** p, mit eingeschränktem Debugging und eingeschränkter Editorunterstützung.
Wenn Sie in Ihrer Konfiguration Logik benötigen, ist der "Pythonic" -Ansatz zum Codieren der Konfiguration in einer realen Sprache viel besser.
quelle
powerbasic (www.powerbasic.com) enthält die Compiler-Direktive:
Dies erhöht die Größe der kompilierten ausführbaren Datei um
<bloatsize>
Bytes. Dies wurde in den Compiler gestellt, falls Personen, die die ausführbare Datei erstellen, die geringe Größe der generierten ausführbaren Datei nicht mögen. es lässt die EXE größer erscheinen, um mit aufgeblähten Programmiersprachen zu konkurrieren :)quelle