Funktionen

Hallo,

kann mir jemand erklären warum das Programm folgende Werte ausgiebt?
10; 5; 50; 50; 10

Vilen Dank im Voraus!
Gruss,
Alexander

#include

#define PRINT(x) printf(#x" = %d\n",x)

#define LOW 0
#define HIGH 10
#define LIMIT (HIGH + LOW)/2

int func1(int i);
int func2(int i);

int i = LOW;

int main(void)
{
auto int i=10;

func2( i/2 ); PRINT(i); /* ____________ */

func2( i=i/2 ); PRINT(i); /* ____________ */

i=func2( i/2 ); PRINT(i); /* ____________ */

func1( i ); PRINT(i); /* ____________ */

i=func1( i ); PRINT(i); /* ____________ */

return (0);
}

int func1(int i)
{
i = (i

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

Hallo und vielen Dank für deine sehr gute Erklärun!

Eine Frage habe ich aber trotzdem noch.

Und zwar :

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.

wie kommst du auf 25? wenn j 5 ist und i (integer)=2, dann muss doch 10 rauskommen?

Danke,
und vielen Dank nochmal!

wie kommst du auf 25? wenn j 5 ist und i (integer)=2, dann
muss doch 10 rauskommen?

j wird beim ersten Aufruf 5, beim zweiten j*5 = 25.

Danke
Danke