Seite 1 von 1

Reihenfolge der Ausführung?

Verfasst: Sa Nov 22, 2014 9:20 pm
von Pechvogel
Hallo!

Mich würde interessieren, in welcher Reihenfolge, verschachtelte Anweisungen (bzw. Funktionen) ausgeführt werden.
Diesbezüglich habe ich folgendes Beispiel:

Code: Alles auswählen

printf("Der Wert von "mau" entspricht %i . Nachdem mau mit Maumau() verarbeitet wird, entspricht es %i .", mau , Maumau(&mau));
Angenommen die Funktion Maumau() (die eine einfache mathematische Operation mit "mau" durchführt), der die Adresse von mau übergeben wird, speichert ihr Ergebnis in *mau ab.
Demenstrechend ändert sich der Wert von mau auch außerhalb der Funktion Maumau().
Ändert er sich aber auch bereits in der Funktion printf()?
Wenn printf() ausgeführt wird, gibt es dann beim ersten Platzhalter schon den neuen Wert von mau an?
Wenn dem so wäre, ist es also so, dass printf() bevor es überhaupt irgendetwas tut, die Variablen die am Ende hinter den Anführungszeichen stehen alle samt auswertet und dann erst in die Platzhalter einsetzt und nicht erst auswertet, wenn es auf den entsprechenden Platzhalter stößt, oder?

Nebenbei kann mir vllt noch jemand sagen, was Operatorbäume sind, die Ergebnisse, die ich im Internet dazu finde sind verwirrend.

Danke schonmal!

Re: Reihenfolge der Ausführung?

Verfasst: So Nov 23, 2014 1:08 am
von Xin
Pechvogel hat geschrieben:Mich würde interessieren, in welcher Reihenfolge, verschachtelte Anweisungen (bzw. Funktionen) ausgeführt werden.
Diesbezüglich habe ich folgendes Beispiel:

Code: Alles auswählen

printf("Der Wert von "mau" entspricht %i . Nachdem mau mit Maumau() verarbeitet wird, entspricht es %i .", mau , Maumau(&mau));
Angenommen die Funktion Maumau() (die eine einfache mathematische Operation mit "mau" durchführt), der die Adresse von mau übergeben wird, speichert ihr Ergebnis in *mau ab.
Demenstrechend ändert sich der Wert von mau auch außerhalb der Funktion Maumau().
Ändert er sich aber auch bereits in der Funktion printf()?
Das ist eine wunderschöne Frage.

Je besser man in der Entwicklung wird, so dass man überhaupt dazu kommt, sich solche Fragen zu stellen, desto öfter wird man hören, dass das Verhalten undefiniert ist. Es ist daher undefiniert, da eine Festlegung eventuell eine schnellere Ausführung verhindern könnte.

Kurz: Die Anweisung ist syntaktisch richtig, semantisch aber willkürlich. Darum solltest Du Dir Rückgabe MauMau merken und damit den Funktionsaufruf vor das printf setzen. Oder eben den Inhalt von mau zwischenspeichern, damit er nicht durch den Aufruf von maumau() überschrieben wird.
Damit wird die Geschichte eindeutig.
Pechvogel hat geschrieben:Wenn printf() ausgeführt wird, gibt es dann beim ersten Platzhalter schon den neuen Wert von mau an?
Wenn dem so wäre, ist es also so, dass printf() bevor es überhaupt irgendetwas tut, die Variablen die am Ende hinter den Anführungszeichen stehen alle samt auswertet und dann erst in die Platzhalter einsetzt und nicht erst auswertet, wenn es auf den entsprechenden Platzhalter stößt, oder?
Alle Parameter werden ausgerechnet, bevor die Funktion aufgerufen wird.
Visual Studio beginnt dabei von hinten: Maumau(&mau) wird also aufgerufen, setzt dann den Wert für mau um, dann wird mau ausgelesen, dann wird printf() gerufen.
Pechvogel hat geschrieben:Nebenbei kann mir vllt noch jemand sagen, was Operatorbäume sind, die Ergebnisse, die ich im Internet dazu finde sind verwirrend.
Ich vermute Du meinst Compilerbäume aka Abstract Syntax Trees (AST):
Nehmen wir eine Rechnung 1+2*3, dann kann man die auch als Funktionen schreiben: add( 1, mul(2,3))
Der Knoten "add" hat zwei Kinder: einmal das Blatt 1 und einmal den Knoten mul. mul hat wieder zwei Kinder, das Blatt 2 und das Blatt 3. Fertig ist der Baum.

Re: Reihenfolge der Ausführung?

Verfasst: Di Nov 25, 2014 3:08 pm
von Pechvogel
Hallo Xin!

Vielen Dank für deine aufschlussreiche Antwort!
Ich hätte lediglich eine Anmerkung:
Alle Parameter werden ausgerechnet, bevor die Funktion aufgerufen wird.
Visual Studio beginnt dabei von hinten: Maumau(&mau) wird also aufgerufen, setzt dann den Wert für mau um, dann wird mau ausgelesen, dann wird printf() gerufen.
Visual Studio ist ja nur Programmierumgebung bzw. IDE, wäre sowas nicht eher vom verwendeten Compiler abhängig? Persönlich schaue bzw. achte ich nicht darauf welcher Compiler an meine IDE gekoppelt ist, aber denke mal, dass wenn etwas variieren kann, es von diesem abhängt. Wobei ich auch sagen muss, dass ich Codeblocks nutze und mir nicht sicher bin, wie es bei VisualStudio ist.
Ich vermute Du meinst Compilerbäume aka Abstract Syntax Trees (AST):
Nehmen wir eine Rechnung 1+2*3, dann kann man die auch als Funktionen schreiben: add( 1, mul(2,3))
Der Knoten "add" hat zwei Kinder: einmal das Blatt 1 und einmal den Knoten mul. mul hat wieder zwei Kinder, das Blatt 2 und das Blatt 3. Fertig ist der Baum.
Hat anscheinend mehrere Namen. Danke für die Beschreibung!

Re: Reihenfolge der Ausführung?

Verfasst: Di Nov 25, 2014 7:22 pm
von Xin
Pechvogel hat geschrieben:Ich hätte lediglich eine Anmerkung:
Alle Parameter werden ausgerechnet, bevor die Funktion aufgerufen wird.
Visual Studio beginnt dabei von hinten: Maumau(&mau) wird also aufgerufen, setzt dann den Wert für mau um, dann wird mau ausgelesen, dann wird printf() gerufen.
Visual Studio ist ja nur Programmierumgebung bzw. IDE, wäre sowas nicht eher vom verwendeten Compiler abhängig?
Das ist richtig. Richtig formuliert müsste es Visual C++ heißen. Die Interpretation des Quelltextes wird ausschließlich vom Compiler geleistet und nicht von der IDE.