> kann mir jemand erklären was hier passiert, bzw wie es funktioniert?
Ist doch eigentlich nicht so schwer. Der Anfang, vor diesem hübschen
Ball mal etwas übersichtlicher geschrieben:
1 | #define _ -F < 0 || --F - OO--;
|
2 |
|
3 | int F=0, OO=0;
|
4 |
|
5 | main()
|
6 | {
|
7 | F_OO();
|
8 | printf("%1.3f\n",4.0 * -F / OO / OO);
|
9 | }
|
10 |
|
11 | F_OO()
|
12 | {
|
Also macht main eigentlich nichts weiter, als die Funktion F_OO
aufzurufen, dann das Ergebnis von 4.0 * -F / OO / OO auszugeben.
Der Ball wird durch Makro-Auflösung zu Code.
Schauen wir uns mal die erste Zeile an:
Also, _ wird durch '-F<00||--F-OO--;' ersetzt. Damit wird daraus:
1 | -F<00||--F-OO--;
|
2 | --F<00||--F-OO--;
|
3 | -F<00||--F-OO--;
|
4 | --F<00||--F-OO--;
|
5 | -F<00||--F-OO--;
|
6 | --F<00||--F-OO--;
|
7 | -F<00||--F-OO--;
|
Die erste Zeile davon mal etwas übersichtlicher
-F < 0 || --F - OO--;
Der Operator || arbeitet hier als Ersatz für if, da der Ausdruck
dahinter nur dann ausgewertet wird, wenn der davor nicht 0 ist. Der Wert
des ganzen wird hier einfach ignoriert. Dadurch wird auch das Ergebnis
der Subtraktion ignoriert. Also könnte man das auch noch lesbarer
schreiben:
1 | if (F > 0)
|
2 | {
|
3 | F--;
|
4 | OO--;
|
5 | }
|
Das
funktioniert dann genaus, nur eben mit umgekehrtem Vorzeichen. Diese
Operationen werden dann eben entsprechend oft ausgeführt (nachzählen
darfst du selber).