Reihenfolge der Ausführung?

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Pechvogel
Beiträge: 4
Registriert: Mo Nov 17, 2014 12:48 pm

Reihenfolge der Ausführung?

Beitrag von Pechvogel » Sa Nov 22, 2014 9:20 pm

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!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Reihenfolge der Ausführung?

Beitrag von Xin » So Nov 23, 2014 1:08 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Pechvogel
Beiträge: 4
Registriert: Mo Nov 17, 2014 12:48 pm

Re: Reihenfolge der Ausführung?

Beitrag von Pechvogel » Di Nov 25, 2014 3:08 pm

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!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Reihenfolge der Ausführung?

Beitrag von Xin » Di Nov 25, 2014 7:22 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten