Frage Merkwürdigste Sprachfunktion


Was ist Ihrer Meinung nach das überraschendste, komischste, merkwürdigste oder wirklich "WTF" -Sprachenmerkmal, auf das Sie gestoßen sind?

Bitte nur eine Funktion pro Antwort.


975


Ursprung


Antworten:


In C können Arrays wie folgt indiziert werden:

a[10]

Das ist sehr häufig.

Die weniger bekannte Form (die wirklich funktioniert!) Ist jedoch:

10[a]

Das bedeutet dasselbe wie oben.


1861



In JavaScript:

 '5' + 3 gives '53'

Wohingegen

 '5' - 3 gives 2

1296



In JavaScript das folgende Konstrukt

return
{
    id : 1234,
    title : 'Tony the Pony'
};

kehrt zurück undefined ist ein Syntaxfehler aufgrund der hinterhältigen impliziten Semikoloneinfügung auf der Newline nach return. Das Folgende funktioniert wie erwartet:

return {
    id : 1234,
    title : 'Tony the Pony'
};

Schlimmer noch, das funktioniert auch (zumindest in Chrome):

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

Hier ist eine Variante des gleichen Problems, die keinen Syntaxfehler ergibt, sondern einfach nur fehlschlägt:

return
    2 + 2;

872



JavaScript-Wahrheitstabelle:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

Quelle: Doug Crockford


797



Trigraphen in C und C ++.

int main() {
   printf("LOL??!");
}

Dies wird gedruckt LOL|weil der Trigraph ??! wird konvertiert in |.


662



Spaß mit Auto-Boxen und dem Integer-Cache in Java:

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

Erläuterung

Ein kurzer Blick auf den Java-Quellcode zeigt folgendes:

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

Hinweis:  IntegerCache.high standardmäßig auf 127 sofern nicht durch eine Eigenschaft festgelegt.

Was beim automatischen Boxen passiert, ist, dass foo und bar das gleiche Integer-Objekt aus dem Cache abrufen, wenn es nicht explizit erzeugt wird: z. foo = new Integer(42)Daher werden sie beim Vergleich der Bezugsgleichheit eher wahr als falsch sein. Die richtige Methode zum Vergleichen von Integer-Werten ist die Verwendung von .equals;


574



Zitieren Neil Fraser (schau auf das Ende dieser Seite),

try {
    return true;
} finally {
    return false;
}

(in Java, aber das Verhalten ist anscheinend in JavaScript und Python identisch). Das Ergebnis bleibt dem Leser als Übung überlassen.

BEARBEITET: So lange wir das Thema behandeln, bedenke auch folgendes:

try {
    throw new AssertionError();
} finally {
    return false;
}

373



APL (außer ALLES), die Fähigkeit, jedes Programm in nur einer Zeile zu schreiben.

z.B. Conway Spiel des Lebens in einer Zeile in APL:

Alt Text http://catpad.net/michael/APLLife.gif

Wenn diese Linie nicht WTF ist, dann ist nichts!

Und hier ist ein Video


325