Hallo,
kann mir jemand erklären warum das Programm folgende Werte
ausgiebt?
10; 5; 50; 50; 10
Weil es so programmiert wurde. Und zwar möglichst Unübersichtlich. Es ist auch im großen und ganzen nix sinnvolles, was da gemacht wird. Welcher Spacken hat das denn geschrieben? Vermutlich so ein Professor.
Im Einzelnen:
#include
#define LOW 0
#define HIGH 10
#define LIMIT (HIGH + LOW)/2
int func1(int i);
int func2(int i);
int i = LOW;
Bis hierhin dürfte alles klar sein.
int main(void)
{
auto int i=10;
func2( i/2 ); PRINT(i); /* ____________ */
Da i=10 ist, wird das auch ausgegeben. Die „Funktion“ func2 hat keinen Einfluss auf i.
func2( i=i/2 ); PRINT(i); /* ____________ */
Hier wird i halbiert.
i=func2( i/2 ); PRINT(i); /* ____________ */
Da j in func2 „static“ deklariert ist, steht j beim Aufruf der Funktion hier auf 5. Da i „integer“ ist, wird der Nachkommaanteil von „i=2,5“ ignoriert. Also: i=func2(2) = 25*2 = 50.
func1( i ); PRINT(i); /* ____________ */
func1 hat keinen Einfluss auf i, es bleibt also bei der 50.
i=func1( i ); PRINT(i); /* ____________ */
func1 bemüht sich auch erfolglos um „obfuscation“ einer if-Abfrage durch das elende ?-Konstrukt. Dennoch gilt: i ist nicht kleiner als das LIMIT, also wird HIGH zurückgeliefert, das zuvor auf 10 gesetzt war. Also kommt auch 10 raus.
Ende.
Wenn dem Prof sowas Spass macht, dann zeige ihm doch mal zur Revanche
http://www.es.ioccc.org/2000/primenum.c
oder
http://www.es.ioccc.org/2000/bellard.c
Du findest jede Menge mehr hübscher Beispiele unter
http://www.es.ioccc.org/
Und das tolle ist: Diese Programme tun alle etwas wirklich sinnvolles!
Gruß und Beileid zum katastrophalen Prof/Lehrer/Kurs
Fritze