Pregunta Característica de lenguaje más extraño


¿Cuál es, en tu opinión, la característica de lenguaje más sorprendente, extraña, extraña o realmente "WTF" que has encontrado?

Por favor, solo una característica por respuesta.


975


origen


Respuestas:


En C, las matrices se pueden indexar así:

a[10]

que es muy común

Sin embargo, la forma menos conocida (que realmente funciona) es:

10[a]

lo que significa lo mismo que el anterior.


1861



En JavaScript:

 '5' + 3 gives '53'

Mientras

 '5' - 3 gives 2

1296



En JavaScript, la siguiente construcción

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

devoluciones undefined es un error de sintaxis debido a la inserción de punto y coma implícita en la nueva línea después return. El siguiente funciona como esperarías sin embargo:

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

Peor aún, este funciona también (en Chrome, al menos):

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

Aquí hay una variante del mismo problema que no produce un error de sintaxis, simplemente falla silenciosamente:

return
    2 + 2;

872



Tabla de verdad de JavaScript:

''        ==   '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

Fuente: Doug Crockford


797



Trigraphs en C y C ++.

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

Esto se imprimirá LOL|, porque el trigraph ??! se convierte a |.


662



Diversión con el auto boxeo y la caché entera en 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

Explicación

Un vistazo rápido al código fuente de Java mostrará lo siguiente:

/**
 * 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);
}

Nota:  IntegerCache.high predeterminado a 127 a menos que lo establezca una propiedad.

Lo que sucede con el auto boxeo es que tanto foo como bar eliminan el mismo objeto entero de la memoria caché a menos que se cree explícitamente: p. foo = new Integer(42), por lo tanto, al comparar la igualdad de referencia, serán verdaderos en lugar de falsos. La forma correcta de comparar el valor entero es usar .equals;


574



Citando Neil Fraser (mira el final de esa página),

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

(en Java, pero el comportamiento aparentemente es el mismo en JavaScript y Python). El resultado se deja como un ejercicio para el lector.

EDITADO: Mientras estemos en el tema, considere también esto:

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

373



APL (que no sea TODO), la capacidad de escribir cualquier programa en una sola línea.

p.ej. El juego de la vida de Conway en una línea en APL:

texto alternativo http://catpad.net/michael/APLLife.gif

Si esa línea no es WTF, entonces ¡nada lo es!

Y aquí hay un vídeo


325



Las cosas extrañas en las que se pueden usar las plantillas de C ++, mejor demostradas por "Literales analógicos multidimensionales" que usa plantillas para calcular el área de formas "dibujadas". El siguiente código es C ++ válido para un rectángulo de 3x3

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

O, otro ejemplo con un cubo 3D:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

322



Muchas variables incorporadas de Perl:

  • $# - no ¡un comentario!
  • $0, $$y $? - al igual que las variables de shell con el mismo nombre
  • , $&y $' - Variables de coincidencia extrañas
  • $" y $, - variables extrañas para list-y-field-output-separators
  • $! - me gusta errno como un número, pero strerror(errno) como una cadena
  • $_ - el variable sigilosa, siempre usada y nunca vista
  • $#_ - número de índice del último argumento de subrutina ... tal vez
  • @_ - los (no) nombres de la función actual ... tal vez
  • $@ - la última excepción planteada
  • %:: - la tabla de símbolos
  • $:, $^, $~, $-y $= - algo relacionado con los formatos de salida
  • $. y $%- número de línea de entrada, número de página de salida
  • $/ y $\ - separadores de registros de entrada y salida
  • $| - controlador de almacenamiento en búfer de salida
  • $[ - cambie su base de matriz de 0 a 1 a 42: ¡CUESTA!
  • $} - nada en absoluto, por extraño que parezca!
  • $<, $>, $(, $) - UID y GID reales y efectivos
  • @ISA - nombres de las superclases directas del paquete actual
  • $^T - tiempo de inicio de script en segundos epoch
  • $^O - nombre del sistema operativo actual
  • $^V - ¿Qué versión de Perl esto es

Hay mucho más de donde vinieron esos. Lea la lista completa aquí.


292