Che cosa? Nessun errore? [chiuso]


197

Il tuo compito è semplice. Scrivi un programma che ovviamente dovrebbe produrre un errore a prima vista o quando compilato o eseguito, ma non lo fa o produce qualche altro errore non correlato. Questo è un concorso di popolarità, quindi sii creativo.


11
hmmmm .... questo è un rompicapo. +1
Tim Seguine

1
Vorrei poterlo trovare ... c'era un vecchio esempio PL / I che includeva un'istruzione lungo le righe di "if if if = then then allora = else else else = if then else ..." (PL / Ho permesso di utilizzare le sue parole chiave come nomi di variabili e aveva un'espressione condizionale simile a quella di C?: che utilizzava anche le parole chiave if / then / else ...)
keshlam

8
Suggerisco l'intero linguaggio brainfuck, perché il codice BF sembra che non si compili.
Agi Hammerthief

@NigelNquande solo se non lo conosci ...;)
Jwosty

Risposte:


281

C ++

Assicurati di compilare il seguente codice in modalità conforme standard (ad esempio, per g ++ usa il flag -ansi):

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

Come funziona:

?? / è una sequenza trigraph che viene tradotta in una barra rovesciata che sfugge alla nuova riga successiva, quindi la riga successiva fa ancora parte del commento e quindi non genererà un errore di sintassi. Si noti che in C ++, omettere il ritorno in mainè ben definito ed equivale a restituire 0, indicando una corretta esecuzione.


7
Mi sento come se la prima risposta fosse appena stata vinta fin dall'inizio.
temporary_user_name

1
È valido anche in C99.
R ..

1
ci sono avvertimenti con -Wall
BЈовић

2
@ BЈовић Wall lancia sempre avvertimenti su tutto
Kiwy

4
@Kiwy Emette un avviso solo per il codice garbage come sopra. -Wall non lancia avvisi per tutto.
BЈовић,

86

Rubino

Sempre un fan di questo.

x = x

No NameError. x è ora nil.

Questa è solo una "caratteristica" di Ruby :-)

Eccone uno più banale che mi ha ottenuto prima:

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 

Stampa "niente da vedere qui".

E ' ELSIF , non elseif . (e certamente non è elif - guai al programmatore python ribelle (me)!) Quindi per l'interprete elseif sembra una normale chiamata di metodo, e poiché non entriamo nel blocco x <0, andiamo direttamente su else e non sollevare un'eccezione. Questo bug è incredibilmente evidente in qualsiasi ambiente che evidenzi la sintassi, per fortuna (?) Il codice golf non è un tale ambiente.


5
Mi hai. Ho già fatto sia Python che Lua, e ora inizio su Ruby. Lua lo usa.
Riking

7
Il significato dell'universo non è niente da vedere?
user80551


77

C?

Codice abbastanza normale qui ...

void main() = main--;

È Haskell, non C. Definisce una funzione chiamata "void" che accetta due argomenti. Il primo si chiama "principale" e se il secondo (senza nome) è una tupla vuota, restituisce la variabile "principale". "-" inizia un commento in Haskell, quindi il ";" è commentato.


21
Quindi, in altre parole, è barare?
Lister

75
Il tradimento è normale nelle competizioni di code-challenge. Lo chiamiamo creatività. : P
Joe Z.

31
Definirei questo imbroglio, non creatività. Devi definire l'ambiente in cui stai eseguendo prima di poter anche considerare se qualche codice si guiderà o meno. Altrimenti potrei solo darti il ​​rumore di linea che è Malbolge e chiederti se si compila.
Tim S.

5
Dovrebbe solo farti fermare per un secondo e andare "ehi, puoi farlo ?" :)
intx13

10
@JoeZ. In alcuni casi potrebbe sembrare come perl.
user80551

72

JavaScript

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

Ecco come funziona:

Il primo aè in realtà un а(cioè Cryllic Unicode "a").


8
Questo trucco può essere applicato a tutte le lingue che accettano il token Unicode (ad esempio Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, esemplificato dal tuo nome utente
TheDoctor

9
soluzione troppo ovvia
thepirat000

6
troppo ovvio per chiunque lo abbia mai visto prima. Sono sicuro che molti neofiti e i cosiddetti "esperti web" potrebbero inciampare su di esso.
Thebluefish

42
Ovvio? Quindi guardi sempre i nomi delle tue variabili attraverso i loro numeri Unicode anziché da come sono? Potresti notarlo se cerchi "a" (o "а"?) E non riesci a trovare quello che ti aspetti, ma quando leggi semplicemente non riesci a vederlo (almeno nel carattere mostrato qui).
Tim S.

70

JavaScript

Quando stavo fornendo il seguente codice mi è stato detto molte volte "Deve essere un refuso! Come può funzionare?" .

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

La descrizione che segue è stata copiata esattamente da uno dei casi recenti .

Come probabilmente saprai, in JavaScript tutto tranne i letterali è un oggetto. Anche i numeri sono oggetti. Quindi teoricamente (e praticamente) puoi ottenere proprietà o chiamare metodi di qualsiasi non letterale tramite notazione punto, come fai tu 'string'.lengtho [1,2,3].pop(). In caso di numeri puoi fare lo stesso ma dovresti tenere presente che dopo un singolo punto il parser cercherà una parte frazionaria del numero aspettandosi un valore float (come in 123.45). Se si utilizza un numero intero si dovrebbe "raccontare" il parser che una parte frazionaria è vuoto, l'impostazione di un punto in più prima di affrontare una proprietà: 123..method().


18
Come lua guy, mi aspettavo422
mniip

3
Non ho mai visto questo uso prima, molto pulito.
Nit

5
Sentiti male per essere perfettamente abituato alla ..notazione, ma del tutto all'oscuro della .toString(a freaking argument here?)notazione: P Oh beh, l'ho capito ormai :)
David Mulder

Cosa significa questo output? E perché ? Io sono curioso.
Nicolas Barbulesco,

3
Per i pigri, l'argomento specifica la base (quindi questo stamperà 42 in binario) e non è affatto importante per questo codice. ..è la parte confusa.
Kat,

63

bash

#!/bin/bash

[ 1 < 2 ] && exit

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

while [[ false ]]
    do :
done

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

risultati

  • Potresti aspettarti che lo script non produca alcun errore, poiché esce dopo il primo comando. Non

  • Potresti aspettarti i tipici messaggi di errore causati da una bomba a forcella in corso a causa del forloop. Non c'è bomba a forcella.

  • Potresti aspettarti che bash si lamenti del maybecomando mancante o dell'intero gruppo di errori di sintassi all'interno del ifblocco. Non lo farà.

  • L'unico messaggio di errore che lo script potrebbe generare termina 2: No such file or directory.

Spiegazione

  • [non è speciale per bash, quindi < 2esegue, come al solito, il reindirizzamento. A meno che non ci sia un file con nome 2nella directory corrente, ciò causerà un errore.

  • A causa dell'errore sopra riportato, il comando precedente &&avrà uno stato di uscita diverso da zero e exitnon verrà eseguito.

  • Il forciclo non è infinito. In effetti, non esiste alcun loop. Poiché bash non può calcolare la 64a potenza di 2, il risultato dell'espressione aritmetica è 0.

  • [[ false ]]verifica se falseè una stringa nulla. Non lo è, quindi questo whileciclo è infinito.

  • A causa di quanto sopra, l' ifistruzione non viene mai eseguita, quindi non vengono rilevati errori.


55

Perl

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

Fonte e spiegazione: https://stackoverflow.com/questions/11695110


137
I programmi Perl sembrano generalmente errori.
ugoren,

1
@ugoren Solo quando scritto e letto da chi ha poca conoscenza del Perl.
TLP

8
Devi amare il fatto che il commento di @ugoren abbia il doppio di voti rispetto alla risposta :)
yo

2
Mi ricorda il trucco della shell di Windows, "Se sei felice e lo sai, Errore di sintassi!"
Jwosty,

47

Giava

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

Nessuno stack trabocca qui; andare avanti.

A prima vista, questo dovrebbe produrre un StackOverflowError, ma non lo fa! In realtà funziona solo per sempre (almeno per tutti gli scopi pratici; tecnicamente terminerebbe dopo un tempo molti ordini di grandezza più lunghi dell'età dell'universo). Se vuoi sapere come / perché funziona, vedi questo . Inoltre, se ti capita di chiederti perché possiamo chiamare main()senza argomenti quando il metodo principale in genere avrebbe bisogno di un String[]argomento: è perché qui l'abbiamo dichiarato argomento variabile, il che è perfettamente valido.


3
Come spiega la domanda che hai collegato, non funziona all'infinito, ma invece per un tempo estremamente lungo.
Kevin

1
@Kevin Non diventiamo inutilmente pedanti qui; "più lungo dell'età dell'universo" è, per tutti gli scopi pratici, "per sempre".
Arshajii,

8
Dici "Nessun overflow dello stack qui", quando in realtà il sistema continua a lanciare continuamente overflow dello stack e alla fine genererà un'eccezione di overflow dello stack. (come hai detto, alla fine potrebbe essere un tempo molto lungo) E dipende dalla profondità dello stack. Su una VM più piccola o su un sistema incorporato, la profondità dello stack potrebbe essere molto più piccola.
McKay,

@McKay Quell'affermazione è chiaramente una semplice linea di lancio, non pensata per essere presa alla lettera. L'OP chiede un programma che sembra che dovrebbe produrre un errore, ma non lo fa. Nel caso generale, la risposta sopra soddisfa questo requisito. Certo, possiamo inventare una situazione oscura in cui non lo fa, ma ciò non invalida la risposta. Spero che riconsidererai il tuo voto negativo.
Arshajii,

3
@McKay A proposito, supponiamo che le dimensioni dello stack siano piccole (ad esempio 100 rispetto al normale ~ 10.000) e che possiamo ancora effettuare 10.000.000 di chiamate al secondo. Quindi il tempo di esecuzione totale arriva a 4.019.693.684.133.147 anni - ancora molti ordini di grandezza più grandi dell'età dell'universo.
Arshajii,

42

CoffeeScript

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

?seguito da uno spazio è un operatore che chiama una funzione, ma solo se esiste. JavaScript non ha una funzione chiamata What, quindi la funzione non viene chiamata e i suoi argomenti vengono semplicemente ignorati. Le altre parole nel codice sono chiamate di funzione che in realtà non sono chiamate, perché la Whatfunzione non esiste. Alla fine, ?è operatore operatore, in quanto non viene utilizzato nella funzione di chiamata. Altri terminatori di frasi, come .o !non funzionano, come .per i metodi, e !non sono operatori (che non possono essere utilizzati dopo un identificatore). Per leggere come CoffeeScript ha convertito questo in JavaScript, visitare 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

L' &operatore in VBScript è la concatenazione di stringhe ma cosa diavolo sono gli operatori &&e &&&? (Ricorda che l'operatore "e" in VBScript Andnon lo è &&.)

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

Quel frammento di programma è VBScript legale. Perché? E qual è il valore di x?

Il lexer lo scompone come x = 10 & 987 & &654& & &321. Un letterale intero che inizia con &è, stranamente, un letterale ottale. Un letterale ottale che termina con &è, ancora più stranamente, un numero intero lungo. Quindi il valore di x è la concatenazione dei valori decimali di quei quattro numeri interi: 10987428209.


8
Questo è solo ... wow.
primo

27

Objective-C

Non è un grosso problema, ma mi ha sorpreso mentre cercavo di inserire un link all'interno di un commento:

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

http è un'etichetta di codice qui, tali etichette vengono utilizzate nelle istruzioni goto


8
Questo dovrebbe funzionare in qualsiasi linguaggio di tipo C che supporti i //commenti.
Ilmari Karonen,

Sì, probabilmente, non ero sicuro durante la pubblicazione
Piotr

14
Tuttavia, limita un URL per protocollo per ambito.
Ben Voigt,

1
È ancora possibile utilizzare https: // nello stesso ambito.
Florian F,

25

C #

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

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

Poiché il Barmetodo esegue un yield, il metodo non viene effettivamente eseguito quando viene chiamato, restituisce un enumeratore che, quando ripetuto, esegue il metodo.


Finalmente ... Ecco FOO e BAR :)
VVK

1
Ecco a cosa servono foo e bar;) nomi di cose che in realtà non contano.
McKay,

22

C

main=195;

Funziona su piattaforme x86, dove 195 è il codice operativo per ret. Non fa nulla,


Il codice operativo per ret è 195, non 193, giusto?
Dennis,

Non funziona per me. Mi aspetto che questo esegua il codice all'indirizzo 195.
nwellnhof

Tbanks @Dennis, il codice era corretto, la spiegazione sbagliata.
ugoren,

3
Su qualsiasi piattaforma (incluso il moderno x86) in cui le pagine possono essere lette senza essere anche eseguibili, questo si arresterà in modo anomalo al momento dell'accesso mainperché mainè stato inserito nel segmento di dati, che non è eseguibile. In modo divertente, non siconst int main=195 bloccherà (su x86) (ma produrrà uno stato di uscita di immondizia) perché per impostazione predefinita viene inserito nello stesso segmento ed è quindi eseguibile. ( uscirà con successo! (sempre su x86)).rodata.textconst char main[]="1\300\303";
zwol

2
Sono su una macchina a 64 bit (non so se questo cambierà qualcosa) e main = 195 dà un segfault, ma const int main = 195; lavori.
w4etwetewtwet,

21

Giava

Probabilmente troppo ovvio.

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");
    }
}

Che cosa?

Genera un errore di sintassi dopo \u000d. \u000dè l'unicode per una nuova linea. Anche se è commentato, il compilatore Java tratta ciò che è dopo come codice poiché non è più commentato.


11
tu varargsnon sei varargs;)
Navin

La domanda era "codice che sembra fallire ma non", non "codice che sembra fallire, ma lo fa in modo diverso". Avere un errore di sintassi invece di un'eccezione è ancora un errore.
Nzall

19
Penso che dovresti leggere di nuovo la domanda originale: "o produce qualche altro errore non correlato".
Tom Verelst

In realtà, senza il \u000d, userebbe un riferimento al valore indefinito 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';
}

Perché?

NULLè una costante intergal, quindi corrisponde al intsovraccarico strettamente migliore di int*quello. Tuttavia, la maggior parte dei programmatori si è NULLassociata ai puntatori, quindi ci si può aspettare una dereferenza del puntatore nulla.


11
Per fortuna, C ++ 11 consente alle implementazioni di definire NULLcome nullptr, e le implementazioni che lo fanno (nessuna ancora che io sappia, ma che mi aspetto) daranno l'errore di segmentazione previsto.
hvd

16

Pitone

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

Perfettamente valido, ma l'output è difficile da indovinare. I primi 3 "caratteri iniziano una stringa multilinea e i successivi due fanno parte della stringa. Alla fine, i primi tre" terminano la stringa e gli ultimi due sono una stringa vuota letterale che viene concatenata dal parser alla stringa multilinea .


20
Solo un bonus: 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...";
}

Come funziona:

C'è infinito positivo e negativo in JS e nessun errore per la divisione per zero.


2
Dovresti essere in grado di fare qualche trucco anche con NaN ...
intx13

8
meh, questo succede in qualsiasi lingua con float.
Navin

3
@Navin: in qualsiasi lingua con float in cui la divisione per zero non causa un errore.
nwk,

2
@nwk Lo standard IEEE per i float afferma che la divisione per zero deve essere un inf. Non conosco alcuna lingua che cambi questo.
Navin,

1
IEEE 754 specifica due modelli: segnalazione NaN / Inf (che genera eccezioni sulla divisione zero FP, radice quadrata da -1, underflow / overflow, ecc.) E non segnalazione (che tratta NaN/ Infproprio come i normali valori argebrici con matematica ben definita su di essi). L'hardware FP moderno può essere configurato per funzionare in entrambi i modi. Indipendente dal linguaggio; peccato non saperlo.
Ulidtko,

14

C ++

Mescolare trigrafi e lambda senza spazio può essere abbastanza confuso e sicuramente apparire errato per le persone che non sono a conoscenza delle trigrafi:

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

Come funziona:

Alcune sequenze composte da 3 simboli, che iniziano con ??, sono chiamate trigrafi e saranno sostituite da un preprocessore completamente conforme. Preelaborata, la riga in questione appare come segue: return ~ [] () {return "\ x00FF"; } () [0]; Come si può vedere, questo non è altro che una funzione lambda superflua che restituisce una stringa composta dal carattere 0xFFth. Il [0] solo estrae quel personaggio e ~ NOTs, quindi viene restituito 0.


12
Il programma C ++ valido int main(){(([](){})());}potrebbe anche apparire bello quando trigraphed ...
Angew

1
Cosa fa quello?
Joe Z.

1
@Joe Z [](){}è una funzione lambda, proprio come [](int a){return a+1;}una. ([](){})()chiama quella funzione, ritornando voidse non sbaglio. Il tutto (([](){})());quindi si riduce a (void);, che è un'affermazione che non fa nulla. mainquindi restituisce solo zero, come dovrebbe senza returnun'istruzione.
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

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

    Debug.Print 1 / UBound(x)

End Sub

La divisione di una stringa delimitata da virgole vuote dovrebbe fornire una matrice vuota. Dovrebbe esserci un'ovvia divisione per zero errori, giusto?

No. Sorprendentemente, quando una stringa di lunghezza zero viene divisa, il runtime fornisce un array con un limite inferiore di 0 e un limite superiore di -1. Il codice sopra mostrerà -1.


@minitech In realtà, se si passa un array vuoto a UBound, si otterrà un errore di sottoscrizione fuori intervallo.
Comintern

… bene. Me lo riprendo. VBA = /
Ry-

1
@minitech Yep. Capisco che si trattava di un bug nell'implementazione originale di Split in VB6. In .NET hanno intenzionalmente "aggiunto" (o forse documentato è la parola migliore) il comportamento di array vuoti che restituiscono un UBound di -1 al fine di mantenere la retrocompatibilità con tutto il codice VB6 che ha sfruttato questo hack. La divisione di una stringa null è l' unico modo per ottenere nativamente questo array in VBA / VB6 senza chiamate API di Windows.
Comintern

12

Javascript

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

Dà: 5

Mentre:

5.toString();

Fornisce SyntaxError

Come funziona:

JavaScript tenta di analizzare il punto su un numero come letterale in virgola mobile


13
Come è successo che hai pubblicato esattamente lo stesso caso che ho fatto un'ora dopo di me?
VisioN,

1
Ehi Vision, scusa ma non ho controllato la tua risposta. Ho anche aggiunto un caso con spazio. Ho letto una volta su javascript garden nient'altro.
Sumeet Kashyap,

1
Sumeet, non dispiacerti. La tua risposta è più bella - e molto più chiara - della risposta di @VisioN.
Nicolas Barbulesco,

12

HTML

Primo post qui, non sono sicuro di avere questo o no, ma qui va.

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

È un .htmlfile ...


9
Quindi il trucco è che non eseguirà il blocco PHP perché il file ha .htmlestensione e il tuo server web non è configurato per analizzare i .htmlfile come PHP?
VisioN,

5
Sì. Questo è barare? @VisioN
Albzi

2
Sono abbastanza sicuro che questo sia barare. Almeno scrivi "HTML" in grassetto in alto.
Navin

Bello ! :-) Il trucco ha funzionato su di me.
Nicolas Barbulesco,

1
Ho modificato per chiarire in che lingua è scritto
vijrox il

9

PHP (40 byte)

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

Questa è stata la risposta che ho dato a questa domanda: Insanity Check Program

L'idea era di creare un codice che producesse errori.

Il primo errore a cui penseremo è un errore di sintassi.

Non ci sono errori di sintassi ...

Altro sarebbe che la classe / funzione non esiste.

Non va così lontano ...

Altro sarebbe un timeout o un overflow della memoria, ma, di nuovo, non raggiunge così lontano ...

Prova qui il codice: http://writecodeonline.com/php/ (rimuovi <?all'inizio per testare).


3
Questo è un concorso di popolarità. Non è necessario ridurre il codice ur per salvare byte. Basta riformattarlo per una migliore leggibilità;)
Songo

Aggiungerò una versione leggibile più tardi. Ho usato la stessa risposta esatta e non l'ho modificata affatto.
Ismael Miguel

foreach(e()as&$e);è il nucleo di questa soluzione. e()è solo per mantenere attivo il sintassi-checker e &$edopo asè ciò che causa l'errore.
TheConstructor

In realtà, tutto gioca un ruolo importante.
Ismael Miguel,

9

VBScript

Gli utenti di Visual Basic 6 lo sapranno

If Blah Then Foo Bar

è legale così com'è

If Blah Then 
    Foo Bar
End If

Ma per quanto riguarda

If Blah Then Foo Bar End If

? Si scopre che è legale in VBScript ma non in VB6. Perché?

È un bug nel parser; l'intenzione era di respingerlo. Il codice che rileva il End Ifdoveva anche verificare se si trattava di Ifun'istruzione multilinea , e non lo fece. Quando ho provato a risolverlo e ho inviato una versione beta con la correzione, una certa influente organizzazione di notizie del settore ha scoperto che avevano questa linea di codice in uno dei loro programmi VBScript e ha detto che avrebbero dato alla nuova versione un punteggio basso a meno che non avessimo annullato- corretto il bug, perché non volevano cambiare il loro codice sorgente.


C'è qualche svantaggio nel lasciare il bug non riparato, oltre a consentire di scrivere codice VBS che non è valido in VB6?
Gabe,

1
@Gabe: No, non c'è altro lato negativo se non che è più difficile trasferire il codice VBScript su VB.
Eric Lippert

1
Un nome ! Chi è questa organizzazione di notizie?
Nicolas Barbulesco,

9

C

Questo mi ha ricordato un errore che ho riscontrato quando ho appreso C. Purtroppo la variante originale non sembra funzionare con un GCC corrente, ma questo continua a:

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

Questo ovviamente segfault perché dereferenziamo un puntatore nullo, giusto?

Sbagliato - in realtà, è un loop infinito poiché la nostra condizione di loop è disattivata da uno. A causa del decremento del prefisso, iva da 1023 a -1. Ciò significa che l'assegnazione sovrascrive non solo tutti gli elementi arr, ma anche la posizione della memoria direttamente prima di esso, che risulta essere il luogo in cui iè memorizzato. Al raggiungimento -1, si isovrascrive 0e quindi la condizione del loop viene nuovamente soddisfatta ...

Questa era la variante originale I che non riesco più a riprodurre:

La stessa cosa ha funzionato iandando verso l'alto da 0 e rimanendo fuori di uno. L'ultimo GCC viene sempre archiviato iprimaarr in memoria; questo deve essere stato diverso nelle versioni precedenti (forse a seconda dell'ordine di dichiarazione). È stato un vero errore che ho prodotto in uno dei miei primi programmi di giocattoli relativi alle matrici.

Inoltre, questo è ovvio se sai come funzionano i puntatori in C, ma può essere sorprendente se non lo fai:

Potresti pensare che l'assegnazione a (--i)[arr]genera un errore, ma è valida ed equivalente a arr[--i]. Un'espressione a[x]è solo zucchero sintattico per il *(a + x)quale calcola e dereferenzia il puntatore all'elemento indicizzato; l'aggiunta è ovviamente commutativa e quindi equivalente a *(x + a).


1
Per quanto posso vedere, il corpo del loop non dovrebbe mai essere eseguito (perché 1234 <= 0 restituisce false). Forse intendevi scrivere "> ="?
Celtschk,

1
@celtschk sì, era un errore di battitura. Grazie per averlo notato!
l4mpi

Questo allineamento di memoria è effettivamente specificato o implementato in questo modo in alcuni compilatori?
Paŭlo Ebermann,

9

Giava

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...");
    }
}

Perché questo funziona:

I campi unitizzati hanno valori predefiniti. In questo caso d è solo 0 . 0/0 = NaN in doppia divisione e NaN non è mai uguale a se stesso, quindi if restituisce false. Nota che questo non funzionerebbe se tu avessi 0/0 == 0/0 , poiché at sarebbe una divisione 0/0 intera che DOVREBBE lanciare un'eccezione aritmetica .


8

C ++ 11

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

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

Compilare ed eseguire senza alcun avviso con g++ -pedantic-errors -std=c++11.

complè un'ortografia alternativa standard per ~, proprio come notè un'alternativa per !. complviene utilizzato qui per sovrascrivere operator~e quindi definire un distruttore. Un altro trucco è che operator compè una funzione di conversione dal tipo compa se stesso. Sorprendentemente lo standard non proibisce una tale funzione di conversione, ma afferma che tale funzione non viene mai utilizzata.


8

VBScript

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

'Output: :)

Cosa fa:

I nomi di funzioni, sottotitoli e variabili in VBScript possono essere qualsiasi cosa se si usano parentesi quadre. Questo script crea una funzione chiamata :(e un argomento "):"ma poiché non seguono la normale convenzione di denominazione sono racchiusi tra parentesi quadre. Il valore restituito è impostato sul valore del parametro. Un altro punto viene utilizzato per ottenere tutto su una riga. L'istruzione Msgbox ottiene un riferimento alla funzione (ma non ha bisogno delle parentesi quadre) e la chiama con uno smiley :)come parametro.


1
Così tante facce accigliate :(
Joe Z.

8

C #

In realtà mi sono preso per sbaglio facendo proprio questo :)

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

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

lanciare , non tornare .


Ahah, benvenuto nel sito! Complimenti per il coraggio di questo come primo post. :)
Jonathan Van Matre,

7

Giava

enum derp
{

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

E come funziona:

Innanzitutto pensi che l'Enum non sia valido ma valido; allora pensi che stamperà gli attributi standard di un oggetto Point ma Gotcha! a causa della serializzazione di Snakeyaml viene visualizzato un errore StackOverFLow regolare

E un altro:

enum derp
{

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

    static
    {
        System.exit(x);
    }
}

pensi che uno StackOverflow accadrà a causa dell'ovvia ricorsione, ma il programma abusa del fatto che quando lo esegui static{} blockverrà eseguito per primo e quindi uscirà prima che il main () venga caricato

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;
}

questo si basa su quel /*Error*/codice commentato come punto di chiusura per il commento aperto prima di ab = 0; la spiegazione dell'intero ab a 0x000d nasconde la nuova riga per attivare il commento della riga successiva


1
Non posso adesso, ma sarebbe bello se dovessi riformattare questo, se possibile. È un po 'difficile da leggere com'è ...: P
Jwosty

li ha resi più ovvi; e i tag spoiler sono pensati perché all'inizio i trucchi non sono ovvi
masterX244

2
Aspetta, quindi il primo produce effettivamente un errore? Questo è l'opposto di ciò che la domanda sta ponendo. E perché non solo System.exit (1) nel secondo?
Riking

3
Nessun programmatore Java si aspetterebbe un overflow dello stack nel secondo frammento. Mi dispiace, questo è di gran lunga troppo ovvio.
Tobias,

1
L'abitudine di codegolfing di @VVK da usare enum{invece di class{salvare un byte allora
masterX244

6

C

Stringhe e array in c possono essere piuttosto confusi

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

9
è difficile da leggere, ma non so che tipo di errore le persone si aspettano da questo
Bryan Chen

3
Volevo solo ricordare alla gente una notazione valida ma non convenzionale: rendila ciò che vuoi. Cercherei sicuramente tre volte prima di dire che questo è valido. Innanzitutto, espressioni come 5 [stringa] non sono ben note a un programmatore occasionale e sfidano la logica dell'indicizzazione dell'array. In secondo luogo, '' + stringa sembra aggiungere 2 stringhe, ma con un tipo di virgolette errato. E in terzo luogo, & i ++ sembra l'indirizzo di un numero intero (ma la precedenza se ne occupa). Infine, stiamo scrivendo oltre la stringa letterale (ma non oltre il buffer di supporto più grande).
Orion,

Non sembra troppo male. Ho scritto solo un po 'di codice in C ++, ma posso capirlo.
Navin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.