¿Cuál es, en su opinión, la característica de lenguaje más sorprendente, extraña, extraña o realmente "WTF" que ha encontrado?
Por favor, solo una función por respuesta.
language-agnostic
programming-languages
Robert Harvey
fuente
fuente
Respuestas:
En C, las matrices se pueden indexar así:
Lo cual es muy común.
Sin embargo, la forma menos conocida (¡que realmente funciona!) Es:
lo que significa lo mismo que el anterior.
fuente
En JavaScript:
Mientras
fuente
+
para la concatenación de cuerdas es horribleEn JavaScript, la siguiente construcción
retornoses un error de sintaxis debido a la inserción punto y coma implícita disimulado en la nueva línea despuésundefined
return
. Sin embargo, lo siguiente funciona como es de esperar:Peor aún, este también funciona (al menos en Chrome):
Aquí hay una variante del mismo problema que no produce un error de sintaxis, simplemente falla en silencio:
fuente
Tabla de verdad de JavaScript:
fuente
==
sirve a los ojos del diseñador de idiomas?==
tener el significado de===
, y luego había otro operador, algo así~=
permitía la coerción de tipo.Trígrafos en C y C ++.
Esto se imprimirá
LOL|
porque el trigrafo??!
se convierte a|
.fuente
Diversión con el boxeo automático y el caché de enteros en Java:
Explicación
Un vistazo rápido al código fuente de Java mostrará lo siguiente:
Nota: el valor
IntegerCache.high
predeterminado es a127
menos que lo establezca una propiedad.Lo que sucede con el auto boxing es que tanto foo como bar el mismo objeto entero recuperado de la memoria caché a menos que se cree explícitamente: por ejemplo
foo = new Integer(42)
, al comparar la igualdad de referencia, serán verdaderas en lugar de falsas. La forma correcta de comparar el valor entero es usar.equals;
fuente
Citando a Neil Fraser (mira al final de esa página),
(en Java, pero el comportamiento es aparentemente el mismo en JavaScript y Python). El resultado se deja como ejercicio para el lector.
EDITADO: Mientras estemos en el tema, considere también esto:
fuente
Control cannot leave the body of a finally clause
return
en lafinally
cláusula.APL (aparte de TODO), la capacidad de escribir cualquier programa en una sola línea.
Ej . 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 aqui hay un video
fuente
Las cosas extrañas para las plantillas C ++ se pueden usar, lo que se demuestra mejor con "Literales analógicos multidimensionales" que usan plantillas para calcular el área de formas "dibujadas". El siguiente código es válido en C ++ para un rectángulo de 3x3
O, otro ejemplo con un cubo 3D:
fuente
Las muchas variables incorporadas de Perl:
$#
- No es 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 separadores de campo de lista y salida$!
-errno
como un número perostrerror(errno)
como una cadena$_
- la variable sigilo, siempre utilizada 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 que ver 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 buffer de salida$[
- cambie su base de matriz de 0 a 1 a 42: ¡WHEEE!$}
- Nada en absoluto, ¡curiosamente!$<
,$>
,$(
,$)
- UID y GID reales y efectivos@ISA
- nombres de las superclases directas del paquete actual$^T
- tiempo de inicio del script en segundos de época$^O
- nombre del sistema operativo actual$^V
- ¿Qué versión de Perl es esta?Hay mucho más de donde vinieron esos. Lea la lista completa aquí .
fuente
$[
variable es la más malvada de todas.perldoc perlvar
cada cinco segundos. (Aunque confieso que la mitad del tiempo lo reviso pensando "Sé que hay una variable especial que puede hacer esto por mí, simplemente no recuerdo cuál ..." = P)use English;
es que afecta el rendimiento de RegExp. No estoy inventando esto. perldoc.perl.org/English.html#PERFORMANCE/$foo[bar]/
, en , ¿es la[bar]
parte una clase de caracteres o un subíndice de la matriz@foo
? Grep perldata por la aterradora respuesta.Manejo de PHP de valores numéricos en cadenas . Vea esta respuesta anterior a una pregunta diferente para obtener detalles completos pero, en resumen:
Si tiene dos cadenas que contienen un número diferente de caracteres, no pueden considerarse iguales. Los ceros a la izquierda son importantes porque son cadenas y no números.
PHP no le gustan las cadenas. Está buscando cualquier excusa que pueda encontrar para tratar sus valores como números. Cambie ligeramente los caracteres hexadecimales en esas cadenas y de repente PHP decide que ya no son cadenas, son números en notación científica (a PHP no le importa que use comillas) y son equivalentes porque los ceros iniciales se ignoran para los números. Para reforzar este punto, encontrará que PHP también se evalúa
"01e4" == "10000"
como verdadero porque estos son números con valores equivalentes. Este es un comportamiento documentado, simplemente no es muy sensato.fuente
Vamos a votar por todos los idiomas (como PL / I) que intentaron eliminar las palabras reservadas.
¿Dónde más podrías escribir legalmente expresiones tan divertidas como:
(
IF
,THEN
,ELSE
Son nombres de variables)o
(
IF
es una variableTHEN
yELSE
son subrutinas)fuente
Es bueno conocer la 'característica' de conversión octal de JavaScript:
Más detalles aquí .
fuente
El dispositivo de Duff en C!
En C uno puede entrelazar un do / while con una instrucción switch. Aquí un ejemplo de una memcpy usando este método:
fuente
while
al final es un (condicional) deJMP
regreso aldo
, lo que explica por qué puede omitirlodo
y aún terminar en el bucle.Algol pasa por nombre (ilustrado usando la sintaxis C):
fuente
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]; } }); }
?En Python:
No es un WTF, sino una característica útil.
fuente
(10 > 5 > 1) != ((10 > 5) > 1)
en Python.(funct_a(5)+5 > b > funct_a(5))
solo llamafunct_a(5)
una vez. ¡Es una GRAN característica!funct_a
se llamará dos veces en ese ejemplo. Sinb > funct_a(5) > c
embargo, solo se llamará una vez, a diferencia deb > funct_a(5) and funct_a(5) > c
.En Java:
Se puede escribir como:
fuente
const T*
yT const*
son equivalentes, es loT* const
que contrasta el puntero. Además, odio sin fuentes.numbers()[2]
es una declaración legal.INTERCAL es probablemente el mejor compendio de características de lenguaje más extrañas. Mi favorito personal es la declaración COMEFROM que es (casi) lo opuesto a GOTO.
fuente
PLEASE
modificador con la frecuencia suficiente!No es realmente una característica del lenguaje, sino una falla de implementación: algunos compiladores de Fortran implementaron constantes mediante el uso de un grupo constante. Todos los parámetros fueron pasados por referencia. Si llamó a una función, por ejemplo
El compilador pasaría la dirección de la constante 1 en el grupo constante a la función. Si asignó un valor al parámetro en la función, cambiaría el valor (en este caso el valor de 1) globalmente en el programa. Causó un poco de rascarse la cabeza.
fuente
2+2
puede ser igual5
(¡para valores muy grandes,2
por supuesto!).2+2
lo que sería igual5
para valores pequeños de5
).2 + 2 = 5
; eso será un error de sintaxis. Lo que será cierto es2 + 2 .EQ. 5
.No sé si se puede considerar una función de lenguaje, pero, en C ++, casi cualquier error de compilación relacionado con las plantillas ofrece una buena cantidad de WTF a muchos programadores de C ++ en todo el mundo a diario :)
fuente
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> >)
Los muchos espacios de nombres de C:
O con personajes:
fuente
Diría que todo el espacio en blanco de Python es mi mejor característica de WTF. Es cierto, más o menos te acostumbras después de un tiempo y los editores modernos hacen que sea fácil de tratar, pero incluso después del desarrollo de Python a tiempo completo durante el año pasado, todavía estoy convencido de que fue una mala idea. He leído todo el razonamiento detrás de esto, pero honestamente, se interpone en mi productividad. No por mucho, pero sigue siendo una rebaba debajo de la silla de montar.
editar: a juzgar por los comentarios, algunas personas parecen pensar que no me gusta sangrar mi código. Esa es una evaluación incorrecta. Siempre he sangrado mi código sin importar el idioma y si me veo obligado a hacerlo o no. Lo que no me gusta es que es la sangría la que define en qué bloque está una línea de código. Prefiero delimitadores explícitos para eso. Entre otras razones, encuentro que los delimitadores explícitos hacen que sea más fácil cortar y pegar código.
Por ejemplo, si tengo un bloque con sangría de 4 espacios y lo pego al final de un bloque con sangría de 8 espacios, mi editor (¿todos los editores?) No tengo idea si el código pegado pertenece al bloque de 8 espacios o al exterior bloquear. OTOH, si tengo delimitadores explícitos, es obvio a qué bloque pertenece el código y cómo se debe (re) sangrar; lo hace buscando inteligentemente delimitadores de bloque.
edición 2: algunas personas que proporcionan comentarios parecen pensar que esta es una característica que odio o que creo que hace que Python sea un lenguaje pobre. De nuevo, no es cierto. Si bien no me gusta tanto, eso no viene al caso. La pregunta es sobre la característica más extraña del lenguaje, y creo que esto es extraño, en virtud de que es algo que muy, muy pocos (pero> 0) usan los idiomas.
fuente
Luché un poco sobre esto:
En perl, los módulos deben devolver algo verdadero .
fuente
'Cogito ergo sum';
que, como todos saben, es evidentemente cierto en todos los universos posibles. Esto garantiza la máxima portabilidad".<?=1;?>
devuelve 1.<?=true;?>
devuelve 1.<?=false;?>
devuelve nulo.Me sorprende que nadie haya mencionado las 7 construcciones de bucle de Visual Basic .
Porque pegar un! en frente de su condicional se forma demasiado complicado!
fuente
While
yWhend
", ya que hay algunas personas que pronuncian la palabra "mientras" con la aproximación velar labializada sin voz. Y, por supuesto, se alinea mejor, y el código que se alinea es agradable.Para aquellos que no saben,
bc
es un "lenguaje de calculadora de precisión arbitraria", y lo uso con bastante frecuencia para cálculos rápidos, particularmente cuando los números involucrados son grandes ($
es el indicador):bc
ha sido un comando estándar de Unix durante mucho tiempo.Ahora para la "función WTF". Esto es de
man bc
(énfasis mío):fuente
bc
antes de eso, y quería escribir sobrebc
mi publicación debido a las excelentes citas de la página de manual.echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc
(aunque tal vez ya lo sepas).Siempre me pregunté por qué el programa más simple era:
Mientras que podría ser:
Tal vez esto es para asustar a los estudiantes de informática en primer lugar ...
fuente
JavaScript está orientado a objetos, ¿verdad? Entonces, los métodos de ejecución en cadenas literales y números deberían funcionar. Me gusta
"hello".toUpperCase()
y3.toString()
. Resulta que el segundo es un error de sintaxis, ¿por qué? Porque el analizador espera que un número seguido de un punto sea un literal de coma flotante. Ese no es el WTF, el WTF es que solo tienes que agregar otro punto para que funcione:La razón es que el literal
3.
se interpreta como3.0
y3.0.toString()
funciona bien.fuente
3..__add__(4)
). Por otra parte, creo que(3).__add__(4)
es una forma mucho menos dañada de hacerlo :)3.0.toString()
hace que me piquen los ojos.En JavaScript:
Afortunadamente, la gente amable de stackoverflow.com me lo explicó todo: ¿por qué 2 == [2] en JavaScript?
fuente
===
en su lugar.Number(n)
para hacer algo similar. Desafortunadamente en nuestras dos soluciones se===
rompe = (.Mi característica más odiada es la sintaxis de cualquier archivo de configuración que incluye lógica condicional. Este tipo de cosas abundan en el mundo de Java (Ant, Maven, etc. ¡Sabes quién eres!).
Acabas de programar en lenguaje ac ** p, con depuración limitada y soporte de editor limitado.
Si necesita lógica en su configuración, el enfoque "Pythonic" de codificar la configuración en un lenguaje real es mucho mejor.
fuente
powerbasic (www.powerbasic.com) incluye la directiva del compilador:
esto aumenta el tamaño del ejecutable compilado por
<bloatsize>
bytes. esto se puso en el compilador en caso de que a las personas que crean el ejecutable no les guste el pequeño tamaño del ejecutable generado. hace que el EXE parezca más grande para competir con los lenguajes de programación hinchados :)fuente