¿Qué? ¿No hay error? [cerrado]


196

Tu tarea es simple. Escriba un programa que obviamente debería producir un error a primera vista cuando se compila o ejecuta, pero no lo hace o produce algún otro error no relacionado. Este es un concurso de popularidad, así que sé creativo.


11
hmmmm ... este es un desafío para la mente. +1
Tim Seguine

1
Ojalá pudiera encontrarlo ... había un viejo ejemplo de PL / I que incluía una declaración a lo largo de las líneas de "if if if = then then then = else else else = if then else ..." (PL / I permitió usar sus palabras clave como nombres de variables, y tenía una expresión condicional similar a la de C: que también usaba las palabras clave if / then / else ...)
keshlam

8
Sugiero todo el lenguaje brainfuck, porque el código BF parece que no se compilará.
Agi Hammerthief

@NigelNquande solo si no estás familiarizado con él ...;)
Jwosty

Respuestas:


280

C ++

Asegúrese de compilar el siguiente código en el modo de conformidad estándar (por ejemplo, para g ++ use el indicador -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

Cómo funciona:

El ?? / es una secuencia trigráfica que se traduce en una barra diagonal inversa que escapa a la siguiente línea nueva, por lo que la siguiente línea sigue siendo parte del comentario y, por lo tanto, no generará un error de sintaxis. Tenga en cuenta que en C ++, omitir el retorno mainestá bien definido y es equivalente a devolver 0, lo que indica una ejecución exitosa.


77
Siento que la primera respuesta acaba de ganar esto de inmediato.
temporary_user_name

1
También es válido en C99.
R ..

1
hay advertencias con -Wall
BЈовић

2
@ BЈовић Wall siempre lanza advertencia sobre todo
Kiwy

44
@Kiwy Lanza advertencia solo para código basura como el anterior. El -Wall no arroja advertencias para todo.
B 13овић

86

Rubí

Siempre fanático de este.

x = x

No se NameError. x es ahora nil.

Esto es solo una "característica" de Ruby :-)

Aquí hay uno más mundano que me tiene antes:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

Imprime "nada que ver aquí".

Es elsif , no elseif . (¡y ciertamente no es elif - ay del programador de Python (yo)!) Así que para el intérprete elseif parece una llamada de método normal, y como no ingresamos el bloque x <0, vamos directamente a otra cosa y No plantees una excepción. Este error es increíblemente obvio en cualquier entorno de resaltado de sintaxis, afortunadamente (?) El código golf no es tal entorno.


55
Me tienes. He hecho Python y Lua antes, y ahora empiezo con Ruby. Lua usa ese.
Riking

77
El significado del universo no es nada que ver?
user80551


77

¿C?

Código bastante normal aquí ...

void main() = main--;

Es Haskell, no C. Define una función llamada "vacío" que toma dos argumentos. El primero se llama "main" y si el segundo (sin nombre) es una tupla vacía, devuelve la variable "main". "-" comienza un comentario en Haskell, por lo que el ";" está comentado


21
En otras palabras, ¿es trampa?
Sr. Lister

75
Hacer trampa es normal en las competiciones de desafío de código. Lo llamamos creatividad. : P
Joe Z.

31
Yo llamaría a esto trampa, no creatividad. Debe definir el entorno en el que se está ejecutando antes de siquiera considerar si algún código producirá un error o no. De lo contrario, podría darle el ruido de la línea que es Malbolge y preguntarle si se compila.
Tim S.

55
Se supone que debe hacer que te detengas por un segundo y digas 'oye, ¿puedes hacer eso?' :)
intx13

10
@JoeZ. Se podría parecerse a Perl en algunos casos.
user80551

72

JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

Así es como funciona:

El primero aes en realidad un а(es decir, Cryllic Unicode "a").


8
Este truco se puede aplicar a cualquier idioma que acepte el token Unicode (por ejemplo, Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, ejemplificado por su nombre de usuario
TheDoctor

99
solución demasiado obvia
thepirat000

66
demasiado obvio para cualquiera que lo haya encontrado antes. Estoy seguro de que muchos novatos y los llamados "expertos web" pueden tropezarse con él.
Thebluefish

42
¿Obvio? ¿Entonces siempre mira sus nombres de variables a través de sus números Unicode en lugar de por su aspecto? Puede notarlo si busca "a" (o "а"?) Y no encuentra lo que espera, pero cuando simplemente lee, no puede verlo (al menos en la fuente que se muestra aquí).
Tim S.

70

JavaScript

Cuando estaba proporcionando el siguiente código, muchas veces me dijeron "¡Debe ser un error tipográfico! ¿Cómo puede funcionar?" .

console.log( 42..toString(2) );

La descripción a continuación se copió exactamente de uno de los casos recientes .

Como probablemente sepa, en JavaScript todo, excepto los literales, es un objeto. Los números también son objetos. Entonces, teóricamente (y prácticamente), puede obtener propiedades o métodos de llamada de cualquier no literal a través de la notación de puntos, como lo hace 'string'.lengtho [1,2,3].pop(). En el caso de los números, puede hacer lo mismo, pero debe tener en cuenta que después de un solo punto, el analizador buscará una parte fraccionaria del número que espera un valor flotante (como en 123.45). Si utiliza un número entero que debe "decir" al analizador que una parte fraccionaria está vacía, el establecimiento de un punto extra antes de abordar una propiedad: 123..method().


18
Como chico lua, esperaba422
mniip

3
No he visto este uso antes, muy ordenado.
Nit

55
Sentirse mal por estar perfectamente acostumbrado a la ..notación, pero completamente desorientado con respecto a la .toString(a freaking argument here?)notación: P Oh, bueno, ya lo descubrí :)
David Mulder

¿Qué hace esta salida? Y por qué ? Tengo curiosidad
Nicolas Barbulesco 05 de

3
Para los perezosos, el argumento especifica la base (por lo que esto imprimirá 42 en binario), y no es en absoluto importante para este código. ..Es la parte confusa.
Kat

62

golpetazo

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

Resultados

  • Puede esperar que el script no produzca ningún error, ya que sale después del primer comando. No lo hace.

  • Puede esperar los típicos mensajes de error causados ​​por una bomba tenedor en curso debido al forbucle. No hay bomba tenedor.

  • Puede esperar que bash se queje del maybecomando faltante o de todo el error de sintaxis dentro del ifbloque. No lo hará.

  • El único mensaje de error que puede producir el script termina en 2: No such file or directory.

Explicación

  • [no es especial para bash, por lo que < 2realiza, como de costumbre, la redirección. A menos que haya un archivo con nombre 2en el directorio actual, esto causará un error.

  • Debido a ese error anterior, el comando anterior &&tendrá un estado de salida distinto de cero y exitno se ejecutará.

  • El forbucle no es infinito. De hecho, no hay bucle en absoluto. Como bash no puede calcular la potencia número 64 de 2, el resultado de la expresión aritmética es 0.

  • [[ false ]]prueba si falsees una cadena nula. No lo es, así que este whileciclo es infinito.

  • Debido a lo anterior, la ifdeclaración nunca se ejecuta, por lo que no se detectan errores.


55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

Fuente y explicación: https://stackoverflow.com/questions/11695110


137
Los programas de Perl generalmente parecen errores.
Ugoren

1
@ugoren Solo cuando lo escriben y leen aquellos con poco conocimiento de Perl.
TLP

8
Tienes que amar que el comentario de @ugoren tiene el doble de votos a favor que la respuesta :)
yo '

2
Me recuerda el truco del shell de Windows: "Si está contento y lo sabe, ¡Error de sintaxis!"
Jwosty

47

Java

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

Ninguna pila se desborda aquí; superar.

A primera vista, esto debería producir un StackOverflowError, ¡pero no lo hace! En realidad, solo funciona para siempre (al menos para todos los fines prácticos; técnicamente terminaría después de un tiempo muchos órdenes de magnitud más largos que la edad del universo). Si quieres saber cómo / por qué funciona esto, mira esto . Además, si se pregunta por qué podemos llamar main()sin argumentos cuando el método principal generalmente necesitaría un String[]argumento: es porque aquí lo hemos declarado como argumento variable, lo cual es perfectamente válido.


3
Como explica la pregunta que vinculó, no se ejecuta indefinidamente, sino que dura mucho tiempo.
Kevin

1
@Kevin No nos volvamos innecesariamente pedantes aquí; "más larga que la edad del universo" es, para todos los fines prácticos, "para siempre".
arshajii

8
Usted dice "Aquí no hay desbordamientos de pila", cuando, de hecho, el sistema sigue lanzando desbordamientos de pila continuamente, y eventualmente arrojará una excepción de desbordamiento de pila. (como mencionas, eventualmente podría ser mucho, mucho tiempo) Y, depende de la profundidad de la pila. En una máquina virtual más pequeña o un sistema integrado, la profundidad de la pila podría ser mucho menor.
McKay

@McKay Esa declaración es claramente una mera línea de usar y tirar, no debe ser tomada literalmente El OP solicita un programa que parece que debería producir un error, pero no lo hace. En el caso general, la respuesta anterior satisface este requisito. Claro, podemos inventar una situación oscura donde no es así, pero eso no invalida la respuesta. Espero que reconsideres tu voto negativo.
arshajii

3
@McKay Por cierto, suponga que el tamaño de la pila es pequeño (por ejemplo, 100 en lugar de lo normal ~ 10,000), y aún podemos hacer 10,000,000 de llamadas por segundo. Luego, el tiempo total de ejecución es de 4.019.693.684.133.147 años, aún muchos órdenes de magnitud más grandes que la edad del universo.
arshajii

42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?seguido de un espacio es un operador que llama a una función, pero solo si existe. JavaScript no tiene una función llamada What, por lo tanto, la función no se llama y sus argumentos simplemente se ignoran. Las otras palabras en el código son llamadas a funciones que en realidad no se llaman, porque la Whatfunción no existe. Al final, ?es operador de existencia, ya que no se utiliza en la función de llamada. Otros enders de oración, tales como .o !no funcionarían, como .es para los métodos, y !no son operadores (que no pueden usarse después de un identificador). Para leer cómo CoffeeScript convirtió esto a JavaScript, visite http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20why% 20it% 20would% 3F .


36

VBScript

El &operador en VBScript es la concatenación de cadenas, pero ¿qué demonios son los operadores &&y &&&? (Recuerde que el operador "y" en VBScript es And, no &&).

x = 10&987&&654&&&321

Ese fragmento de programa es VBScript legal. ¿Por qué? ¿Y cuál es el valor de x?

El lexer rompe esto como x = 10 & 987 & &654& & &321. Un literal entero que comienza con &es, curiosamente, un literal octal. Un literal octal que termina con &es, aún más extrañamente, un entero largo. Por lo que el valor de x es la concatenación de los valores decimales de las cuatro enteros: 10987428209.


8
Eso es solo ... wow.
primo

27

C objetivo

No es gran cosa, pero me ha sorprendido al intentar poner un enlace dentro de un comentario:

http://www.google.com
        return 42;

http es una etiqueta de código aquí, tales etiquetas se usan en las instrucciones de ir a


8
Esto debería funcionar en cualquier lenguaje tipo C que admita //comentarios.
Ilmari Karonen

Sí, probablemente, simplemente no estaba seguro al publicar
Piotr

14
Sin embargo, hay un límite de URL por protocolo por ámbito.
Ben Voigt

1
Aún puede usar https: // en el mismo ámbito.
Florian F

25

C#

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Debido a que el Barmétodo hace a yield, el método no se ejecuta realmente cuando se lo llama, devuelve un enumerador que, cuando se itera, s ejecuta el método.


Por fin ... Aquí está el FOO y BAR :)
VVK

1
Para eso sirven foo y bar;) nombres de cosas que en realidad no importan.
McKay

22

C

main=195;

Funciona en plataformas x86, donde 195 es el código de operación para ret. No hace nada,


El código de operación para ret es 195, no 193, ¿verdad?
Dennis

No funciona para mi Espero que esto ejecute el código en la dirección 195.
nwellnhof

Tbanks @Dennis, el código era correcto, la explicación incorrecta.
ugoren

3
En cualquier plataforma (incluida la moderna x86) donde las páginas pueden ser legibles sin ser también ejecutables, esto se bloqueará al ingresar mainporque mainse ha colocado en el segmento de datos, que no es ejecutable. Sorprendentemente, const int main=195se no chocar (x86) (pero producirá un estado de salida de basura), porque .rodatapor defecto se pone en el mismo segmento que .text, por lo que es ejecutable. (¡ const char main[]="1\300\303";saldrá con éxito! (todavía en x86))
zwol

2
Estoy en una máquina de 64 bits (no sé si esto cambiará algo) y main = 195 da un segfault, pero const int main = 195; trabajos.
w4etwetewtwet

21

Java

Probablemente demasiado obvio.

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

¿Qué?

Lanza un error de sintaxis después \u000d. \u000des el unicode para una nueva línea. Aunque está comentado, el compilador de Java trata lo que está después de esto como código, ya que ya no está comentado.


11
tu varargsno son varargs;)
Navin

La pregunta era "código que parece que falla pero no lo hace", no "código que parece que falla, pero lo hace de una manera diferente". Tener un error de sintaxis en lugar de una excepción sigue siendo un error.
Nzall

19
Creo que debería leer la pregunta original nuevamente: "o produce algún otro error no relacionado".
Tom Verelst

En realidad, sin el \u000d, usaría una referencia al valor indefinido a.
LegionMammal978

19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

¿Por qué?

NULLes una constante intergal, por lo que coincide con la intsobrecarga estrictamente mejor que la int*. Aún así, la mayoría de los programadores se han NULLasociado con punteros, por lo que se puede esperar una desreferencia de puntero nulo.


11
Afortunadamente, C ++ 11 permite que las implementaciones se definan NULLcomo nullptr, y las implementaciones que lo hacen (ninguna que yo sepa, pero espero) darán el error de segmentación esperado.
hvd

16

Pitón

print """""quintuple-quoted strings!"""""

Perfectamente válido, pero la salida es difícil de adivinar. Los primeros 3 "caracteres comienzan una cadena multilínea y los siguientes dos son parte de la cadena. Al final, los tres primeros terminan la cadena y los dos últimos son un literal de cadena vacío que el analizador concatena con la cadena multilínea. .


20
Sólo un bono: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski

15

JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

Cómo funciona:

Hay infinito positivo y negativo en JS, y no hay error al dividir por cero.


2
También deberías poder hacer algunos trucos con NaN ...
intx13

8
meh, esto sucede en cualquier idioma con flotadores.
Navin

3
@Navin: en cualquier idioma con flotantes donde la división por cero no causa un error.
nwk

2
@nwk El estándar IEEE para flotadores dice que la división por cero debe ser un inf. No conozco ningún idioma que cambie esto.
Navin

1
IEEE 754 especifica dos modelos: señalización NaN / Inf (que genera excepciones en la división de cero FP, raíz cuadrada de -1, subflujo / desbordamiento, etc.) y no señalización (que trata NaN/ Infal igual que los valores argebraicos regulares con matemáticas bien definidas en ellos). El hardware FP moderno se puede configurar para operar en ambos sentidos. Agnóstico del lenguaje; Es una pena no saberlo.
ulidtko

14

C ++

Mezclar trigráficos y lambdas sin espacio puede ser bastante confuso y definitivamente parece erróneo para las personas que no son conscientes de los trigrafos:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

Cómo funciona:

Algunas secuencias que constan de 3 símbolos, que comienzan con ??, se denominan trigrafos y serán sustituidas por un preprocesador totalmente compatible. Preprocesada, la línea en cuestión tiene el siguiente aspecto: return ~ [] () {return "\ x00FF"; } () [0]; Como se puede ver, esto no es más que una función lambda superflua que devuelve una cadena que consta del carácter 0xFF. El [0] simplemente extrae ese carácter y ~ NO lo anota, por lo que se devuelve 0.


12
El programa válido de C ++ int main(){(([](){})());}también podría verse bien cuando se activa ...
Angew

1
¿Qué hace ese?
Joe Z.

1
@Joe Z [](){}es una función lambda, al igual [](int a){return a+1;}que una. ([](){})()llama a esa función, regresando voidsi no me equivoco. Todo (([](){})());se reduce a (void);, que es una declaración que no hace nada. mainentonces solo devuelve cero, como debería sin una returndeclaración.
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

Dividir una cadena delimitada por comas vacía debería dar una matriz vacía. Debería ser una división obvia por cero error, ¿verdad?

No. Sorprendentemente, cuando se divide cualquier cadena de longitud cero, el tiempo de ejecución le proporciona una matriz con un límite inferior de 0 y un límite superior de -1. El código anterior generará -1.


@minitech En realidad, si pasa una matriz vacía a UBound, le dará un error de subíndice fuera de rango.
Comintern

… bien. Tomare eso de vuelta. VBA = /
Ry-

1
@minitech Sí. Entiendo que esto fue un error en la implementación original de Split en VB6. En .NET intencionalmente "agregaron" (o tal vez documentado es la mejor palabra) el comportamiento de las matrices vacías que devuelven un UBound de -1 para mantener la compatibilidad con todos los códigos VB6 que aprovecharon este truco. Dividir una cadena nula es la única forma de obtener esta matriz de forma nativa en VBA / VB6 sin llamadas a la API de Windows.
Comintern

12

Javascript

5..toString();
5 .toString();

Da: 5

Mientras:

5.toString();

Da SyntaxError

Cómo funciona:

JavaScript intenta analizar el punto en un número como un literal de coma flotante


13
¿Cómo sucedió que publicaste exactamente el mismo caso que hice una hora después que yo?
VisioN

1
Hola Vision, lo siento pero no verifiqué tu respuesta. También agregué un caso con espacio. Leí esto una vez en javascript garden nada más.
Sumeet Kashyap

1
Sumeet, no lo lamentes. Su respuesta es mejor y mucho más clara que la respuesta de @VisioN.
Nicolas Barbulesco

12

HTML

Primera publicación aquí, no estoy seguro de haber recibido esto o no, pero aquí va.

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

Es un .htmlarchivo ...


99
Entonces, ¿el truco es que no ejecutará el bloque PHP porque el archivo tiene .htmlextensión y su servidor web no está configurado para analizar .htmlarchivos como PHP?
VisioN

55
Si. ¿Esto es trampa? @VisioN
Albzi

2
Estoy bastante seguro de que esto es trampa. Al menos escriba "HTML" en negrita en la parte superior.
Navin

Agradable ! :-) El truco funcionó en mí.
Nicolas Barbulesco

1
Edité para aclarar en qué idioma está escrito esto
vijrox

9

PHP (40 bytes)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

Esta fue la respuesta que di en esta pregunta: Programa de verificación de locura

La idea era hacer un código que produjera errores.

El primer error que pensaremos es un error de sintaxis.

No hay errores de sintaxis ...

Otro sería que la clase / función no existe.

No corre tan lejos ...

Otro sería un tiempo de espera o un desbordamiento de memoria, pero, de nuevo, no llega tan lejos ...

Pruebe el código aquí: http://writecodeonline.com/php/ (elimine <?al principio para probar).


3
Este es un concurso de popularidad. No hay necesidad de agrupar su código para guardar bytes. Simplemente reformatee para una mejor legibilidad;)
Songo

Agregaré una versión legible más tarde. Usé la misma respuesta exacta y no la edité en absoluto.
Ismael Miguel

foreach(e()as&$e);Es el núcleo de esta solución. e()es solo para mantener funcionando el verificador de sintaxis y &$edespués de aseso es lo que causa la falla.
TheConstructor

En realidad, todo juega un papel importante.
Ismael Miguel

9

VBScript

Los usuarios de Visual Basic 6 sabrán que

If Blah Then Foo Bar

es legal, como es

If Blah Then 
    Foo Bar
End If

Pero que pasa

If Blah Then Foo Bar End If

? Resulta que es legal en VBScript pero no en VB6. ¿Por qué?

Es un error en el analizador; la intención era rechazar esto. Se End Ifsuponía que el código que detecta el también verifica si era una Ifdeclaración de varias líneas , y no lo hizo. Cuando traté de arreglarlo y envié una versión beta con la solución, cierta organización influyente de noticias de la industria descubrió que tenían esta línea de código en uno de sus programas VBScript y dijeron que le darían una baja calificación a la nueva versión a menos que nosotros no solucionó el error, porque no querían cambiar su código fuente.


¿Hay alguna desventaja en dejar el error sin corregir, además de permitirle escribir código VBS que no es válido en VB6?
Gabe

1
@Gabe: No, no hay inconveniente aparte de que es más difícil portar el código VBScript a VB.
Eric Lippert

1
Un nombre ! ¿Quién es esta organización de noticias?
Nicolas Barbulesco 05 de

9

C

Esto me recordó un error que encontré cuando aprendí C. Lamentablemente, la variante original no parece funcionar con un GCC actual, pero este todavía lo hace:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

Obviamente, esto falla porque desreferenciamos un puntero nulo, ¿verdad?

Incorrecto: en realidad, es un bucle infinito ya que nuestra condición de bucle está desactivada por uno. Debido a la disminución del prefijo, iva de 1023 a -1. Esto significa que la asignación sobrescribe no solo todos los elementos arr, sino también la ubicación de la memoria directamente anterior, que es el lugar donde ise almacena. Al alcanzar -1, se isobrescribe con 0y, por lo tanto, la condición de bucle se cumple nuevamente ...

Esta fue la variante original I que ya no puedo reproducir:

Lo mismo funcionó con iir hacia arriba desde 0 y estar fuera por uno. El último GCC siempre se almacena iantes arren la memoria; Esto debe haber sido diferente en versiones anteriores (tal vez dependiendo del orden de la declaración). Fue un error real que produje en uno de mis primeros programas de juguetes que trataban con matrices.

Además, esto es obvio si sabes cómo funcionan los punteros en C, pero puede ser sorprendente si no lo haces:

Puede pensar que la asignación a (--i)[arr]arroja un error, pero es válida y equivalente a arr[--i]. Una expresión a[x]es simplemente azúcar sintáctica para la *(a + x)cual calcula y desreferencia el puntero al elemento indexado; la adición es, por supuesto, conmutativa y, por lo tanto, equivalente a *(x + a).


1
Hasta donde puedo ver, el cuerpo del bucle nunca debe ejecutarse (porque 1234 <= 0 se evalúa como falso). ¿Posiblemente quisiste escribir "> ="?
celtschk

1
@celtschk sí, eso fue un error tipográfico. ¡Gracias por notarlo!
l4mpi

¿Esta alineación de memoria se especifica realmente, o simplemente se implementa de esta manera en algunos compiladores?
Paŭlo Ebermann

9

Java

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

Por qué esto funciona:

Los campos unificados tienen valores predeterminados. En este caso, d es solo 0 . 0/0 = NaN en doble división, y NaN nunca es igual a sí mismo, por lo que el if devuelve falso. Tenga en cuenta que esto no funcionaría si tuviera 0/0 == 0/0 , ya que at sería una división entera 0/0 arrojaría una ArithmeticException .


8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

Compila y ejecuta sin ninguna advertencia con g++ -pedantic-errors -std=c++11.

comples una ortografía alternativa estándar para ~, al igual que notes una alternativa para !. complse usa aquí para anular primero operator~y luego definir un destructor. Otro truco es que operator compes una función de conversión del tipo compa sí mismo. Sorprendentemente, el estándar no prohíbe dicha función de conversión, pero sí dice que dicha función nunca se usa.


8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

Que hace:

Los nombres de funciones, sub y variables en VBScript pueden ser cualquier cosa si usa corchetes. Este script realiza una función llamada :(y un argumento, "):"pero debido a que no siguen la convención de nomenclatura normal, están entre corchetes. El valor de retorno se establece en el valor del parámetro. Se utiliza un colon adicional para obtener todo en una línea. La instrucción Msgbox obtiene una referencia a la función (pero no necesita los corchetes) y la llama con una carita sonriente :)como parámetro.


1
Tantas caras fruncidas :(
Joe Z.

8

C#

En realidad me di cuenta de que estaba haciendo eso por error :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

tirar , no volver .


Jaja, bienvenido al sitio! Felicitaciones por la valentía de esto como primer post. :)
Jonathan Van Matre

7

Java

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

Y cómo funciona ese:

Los primeros crees que el Enum no es válido pero es válido; entonces crees que imprimirá un atributo estándar de objetos Point pero ¡Gotcha! debido a cómo Snakeyaml serializa, obtienes un error StackOverFLow suave

Y otro:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

cree que sucederá un Stackoverflow debido a la recurrencia obvia, pero el programa abusa del hecho de que cuando lo ejecuta, static{} blockse ejecutará primero y debido a que sale antes de que cargue main ()

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

este se basa en ese /*Error*/código comentado como punto de cierre para el comentario abierto antes de ab = 0; la explicación sobre el entero ab a 0x000d oculta la nueva línea para activar el comentario de la siguiente línea


1
No puedo en este momento, pero sería bueno si reformatearas esto, si es posible. Es un poco difícil de leer como es ...: P
Jwosty

los hizo más obvios; y las etiquetas de spoiler están destinadas porque los trucos no son obvios al principio
masterX244

2
Espera, ¿entonces el primero, de hecho, produce un error? Eso es lo opuesto a lo que se hace la pregunta. ¿Y por qué no solo System.exit (1) en el segundo?
Riking

3
Ningún programador de Java esperaría un desbordamiento de pila en el segundo fragmento. Lo siento, eso es demasiado obvio.
Tobias

1
@VVK codegolfing hábito para usar en enum{lugar de class{
guardar

6

C

Las cadenas y las matrices en c pueden ser bastante confusas

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}

99
es difícil de leer, pero no sé qué tipo de error la gente espera de esto
Bryan Chen

3
Solo quería recordarle a la gente una notación válida pero no convencional: haz lo que quieras. Ciertamente miraría tres veces antes de decir que esto es válido. En primer lugar, las expresiones como 5 [string] no son bien conocidas por un codificador casual y desafían la lógica de la indexación de matrices. En segundo lugar, '' + cadena parece agregar 2 cadenas, pero con un tipo incorrecto de comillas. Y en tercer lugar, & i ++ parece la dirección de un número entero (pero la precedencia se encarga de eso). Finalmente, estamos escribiendo más allá del literal de cadena (pero no más allá del búfer de respaldo más grande).
orion

No parece tan malo. Solo he codificado un poco en C ++, pero puedo resolver esto.
Navin
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.