main(){}
Ein regeneratives C-Programm, welches seinen eigenen Quellcode ausdruckt:
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}
Dasselbe in PERL:
#!/usr/bin/perl
open(f,$0); @in = <f>; close(f); print @in
Auch folgende gewagte Konstruktion ist möglich und wahrscheinlich selbst für hartgesottene C-Programmierer erstaunlich. Sie ist Duff's device nach Tom Duff benannt, der sie für Lucasfilm verwendete. Sie ist eine Bytekopierschleife, die count Bytes vom Feld from in die Adresse to kopiert (hier nicht inkrementiert, da to in diesem Fall einen I/O-Port darstellte). Hiermit kann sehr einfach das Problem verbleibender Bytes (wenn count kein Vielfaches von 8 ist) durch CASE-Anweisungen gelöst werden. Man beachte die Überlagerung der Schleife mit den CASE-Marken: das ist möglich in ANSI-C! Pascalianern werden sich hier vermutlich die Rückenhaare aufstellen. Tom Duff bemerkte selbst dazu, er sei sich nicht sicher, ob die Möglichkeit, ein solches Konstrukt in C zu schreiben, für oder gegen C spräche …:
register n = (count + 7) / 8;
switch (count % 8)
{
case 0:
do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
Man kann manches in C kräftig übertreiben. Deklarationen wie z.B.
Zeiger auf eine Funktion mit Wert Zeiger auf Feld von Zeigern auf int
sind syntaktisch möglich, verlangen aber sehr gutes analytisches Durchstehvermögen und sind nicht notwendig:
int *(*(*f)())[];