Start > Algorithmik > Curiosa

Curiosa der Programmiersprachen

Das kleinste mögliche C-Programm

main(){}

Selbstreproduzierende Programme

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

Duffs Device

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 Byte­kopier­schleife, 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);
  }

Formalisierung

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 Durchsteh­vermögen und sind nicht notwendig:

int *(*(*f)())[];
© 2002, 2003 asdala.de: Kon­takt & Daten­obhut