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.