Questo funziona sulla base di molti accorgimenti che C ti consente di fare e alcuni comportamenti non definiti che funzionano a tuo favore. In ordine:
main(a) { ...
Tipi si presume siano int
se non specificato, quindi questo è equivalente a:
int main(int a) { ...
Anche se main
si suppone di prendere 0 o 2 argomenti, e questo è un comportamento indefinito , questo può essere permesso semplicemente ignorando il secondo argomento mancante.
Successivamente, il corpo, che sposterò. Si noti che a
è un int
secondo main
:
printf(a,
34,
a = "main(a){printf(a,34,a=%c%s%c,34);}",
34);
L'ordine di valutazione degli argomenti non è definito, ma stiamo contando sul terzo argomento - l'assegnazione - sempre valutata per prima. Ci stiamo anche affidando al comportamento indefinito di poter assegnare uno char *
a uno int
. Inoltre, si noti che 34 è il valore ASCII di "
. Pertanto, l'impatto previsto del programma è:
int main(int a, char**) {
printf("main(a){printf(a,34,a=%c%s%c,34);}",
'"',
"main(a){printf(a,34,a=%c%s%c,34);}",
'"');
return 0; // also left off
}
che, una volta valutato, produce:
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
che è stato il programma originale. Tada!
3 avvertimenti e nessun errore indica compilazione successo perché non lo fai funzionare? – Cestarian
@Cestarian La domanda non è * cosa * fa - è * come * lo fa? Quindi, il titolo. – Barry
Questo non è in realtà il programma più breve. Il più breve effettivo è lungo 0 byte. È possibile ottenere il compilatore per compilare correttamente un file c di 0 byte in un file eseguibile. L'esecuzione di questo exe comporta la stampa di 0 byte, ovvero l'intero codice sorgente per il programma originale. –