Ergebnis einer Makro Funktion
-
Hi,
ich verstehe nicht, wie folgendes Ergebnis zustande kommt:
#define QUADRAT(x) ((x) * (x)) int main(void) { double zahl = 4.0; QUADRAT(++zahl); //Ergebnis = 36?? }Das ganze ist ein Lehrbeispiel, ich habe sämtliche Kombinationen von Klammerungen ausprobiert und komme nie auf die 36. Wisst ihr, was da intern passiert?
Greez
Haimi
-
#define ist reine Textersetzung.
So wird daraus: ((++zahl)*(++zahl))
Meiner Meinung nach sollte da 30 rauskommen
-
Tatsächlich...!
Unser Skript ist falsch... das verwirrt ja noch mehr als alles andere

Vielen Dank für die Erläuterung!
-
Nein, nichts ist falsch. Das Ergebnis von
((++zahl)*(++zahl))ist nicht definiert. Denn wann die Inkrementierungen ausgeführt werden, ist dem Compiler überlassen.
Ich glaube, das Beispiel sollte damit genau einen Nachteil von Makros zeigen.
-
Das ist Compilerabhängig:
#define QUADRAT(x) ((x) * (x)) int main(void) { double zahl = 4.0; QUADRAT(++zahl); }denkbar wären:
((5) * (5))oder
((5)*(6));oder
((6)*(6));
-
Ist das nicht sowieso UB? (Variable zwischen zwei Sequenzpunkten 2x ändern und so)
Könnte also auch 42 oder "Schweizerwurstsalat" rauskommen.