Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
31.07.2011, 21:59
Raziel



Hallo zusammen,

durch Zufall bin ich heute auf diesen Wikipedia Eintrag gestoßen: International Obfuscated C Code Contest und dort wird folgendes kurzes C Programm als Beispiel vorgstellt:

Quellcode:#include <stdio.h>

#define _ F-->00 || F-OO--;

int F = 00, OO = 00;

main()
{
    F_OO();
    printf("%1.3f\n",4.*-F/OO/OO);
}

F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}

Zitat:
Dieses Programm berechnet die Kreiszahl Pi, indem es seine eigene Fläche nutzt; einen präziseren Wert erhält man, indem man eine Programmversion mit mehr Kreisfläche verwendet.
Leider verstehe ich nur Bahnhof und mich würde doch interessieren, wie das Programm arbeitet. Besonders die #define Anweisung und der Funktionsaufruf in der Main sind mir unklar.
Vlt kann mir wer weiterhelfen :)

--


Dieser Beitrag wurde am 31.07.2011 um 22:02 von Raziel bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
01.08.2011, 02:02
KhanRKerensky



Durch das #define werden alle "_" durch "F-->00 || F-OO--;" ersetzt. Beispielhaft die erste Zeile des Kreises: Aus Quellcode:_-_-_-_ wird also Quellcode:F-->00 || F-OO--;-F-->00 || F-OO--;-F-->00 || F-OO--;-F-->00 || F-OO--; oder mit ein paar Zeilenumbrüchen:
Quellcode:F-->00 || F-OO--;
-F-->00 || F-OO--;
-F-->00 || F-OO--;
-F-->00 || F-OO--;
Durch die short-circuit evaluation der logischen Operatoren bleibt nurnoch
Quellcode:F-->00 || F-OO--;
-F-->00;
-F-->00;
-F-->00;
übrig, da F nie* größer null ist. Das Ergebniss des ganzen Ausdrucks wird allerdings nirgends gespeichert und das einzige was dann noch übrigbleibt sind die Seiteneffekte:
Quellcode:F--; OO--;
F--;
F--;
F--;
OO zählt negativ die Anzahl der Zeilen (die Höhe des Kreises) und F (ebenfalls im Negativen) die Fläche des Kreises.

Bleibt nurnoch das "4.*-F/OO/OO" des printf. F (die Fläche) kann durch -PI*r^2 ersetzt werden und OO (die Höhe) durch -2r:
Quellcode:4. * --PI * r^2 / -2r / -2r
= 4 * PI * r^2 / 4r^2
= PI
So schwer war das doch garnicht, oder?

*Overflows von neg. nach pos. wären zwar vieleicht theoretisch möglich, aber praktisch nicht relevant.

--

"[...] you're going to burn in a very special level of Hell. A level they reserve for child molesters and people who talk at the theater." - Book

zum Seitenanfang zum Seitenende Profil || Suche
002
02.08.2011, 12:52
Raziel



Danke für deine Erklärung & Mühen, mir ist jetzt (größtenteils) klar, was wie passiert. Von alleine wäre ich darauf nicht so schnell gekommen, selbst die Minuszeichen in der Funktion habe ich nicht als solche wahrgenommen ;)

--

zum Seitenanfang zum Seitenende Profil || Suche