Forum: PC-Programmierung define Makro


von Heu (Gast)


Lesenswert?

Hallo
Könnte mir jemand erklären wie folgende Ausgabe zustande kommt?

Ausgabe
: 11 12 10
  10 11 10

Besonders das 111210 kann ich mir nicht erklären

1
#include <iostream.h>
2
#define MAX(A, B) ((A)>(B)?(A):(B))
3
inline int max(int a, int b)
4
{ if (a>b) return a; return b;}
5
main()
6
{ int i, x=10, y=9;
7
i=MAX(x++, y++); cout << i << x << y <<"\n";
8
x=10; y=9;
9
i=max(x++, y++); cout << i << x << y <<"\n";
10
}

Ausgabe
: 11 12 10
  10 11 10


Gruß Heu

von Dominik S. (dasd)


Lesenswert?

Das ist doch sicher mal wieder 'ne Hausaufgabe oder ähnliches...
Naja...
Das define-macro wird vom Präprozessor textuell ersetzt, das andere ist 
eben eine Funktion - aus diesem Grund verhält sich das Inkrement anders.
Wäre jetzt mal die erste fixe Vermutung.

von Karl H. (kbuchegg)


Lesenswert?

Heu schrieb:

> Besonders das 111210 kann ich mir nicht erklären
>

Nimm deinen Code, mach die textuelle Ersetzung für das MAX Makro, setzt 
die Werte ein und führe die Anweisungen aus.

Denn: Genau das gleiche machen auch Präprozessor, Compiler und letzten 
Endes das Programm, wenn es abläuft.


Ja. Es ist wirklich so einfach. Du musst nur genau das tun, was auch der 
Prärpozessor tut: Einen Text durch einen anderen Text ersetzen, wobei du 
die jeweiligen A und B durch die bei der Verwendung angegebenen Sachen 
ersetzt. Und das wars dann auch schon. Zur besseren Analyse kannst du 
dann noch die überflüssigen Klammern weglassen. Und da liegt dann auch 
schon das 'Problem' in seiner vollen Pracht vor dir.

von Karl H. (kbuchegg)


Lesenswert?

Dominik S. schrieb:

> eben eine Funktion - aus diesem Grund verhält sich das Inkrement anders.

'Das Inkrement' verhält sich auch nicht anders. Es inkrementiert.

Mach die textuelle Ersetzung:
Was kommt raus, wenn man in
1
i=MAX(x++, y++)
das MAX Makro auflöst und das MAX anhand der Vorschrift
1
#define MAX(A, B) ((A)>(B)?(A):(B))
durch den zu ersetzenden Text ersetzt?

aus
i=MAX(x++, y++)
wird dann
....

von Dominik S. (dasd)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Das 'Inkrement' verhält sich auch nicht anders. Es Inkrementiert.

Man kann es mit dem "wörtlich nehmen" auch übertreiben.

von Karl H. (kbuchegg)


Lesenswert?

Dominik S. schrieb:
> Karl Heinz Buchegger schrieb:
>> Das 'Inkrement' verhält sich auch nicht anders. Es Inkrementiert.
>
> Man kann es mit dem "wörtlich nehmen" auch übertreiben.

Ich wollt mich nicht lustig machen. Wenn das so rüber gekommen ist, 
entschuldige ich mich.
Tatsächlich kann aber das Inkrement an sich ja nichts dafür. Es ist 
nicht an dem was rauskommt schuld. Wohl aber sind es 'die Inkremente' 
(Ich will es jetzt für den TO nicht zu einfach machen. Er soll die 
textuelle Ersetzung vornehmen. Nur so kann man mit dem Mythos "Makros 
statt Funktionen" aufräumen.)

von Heu (Gast)


Lesenswert?

Hallo

Mit der Textersetzung ergibt sich folgendes:
int i, x=10, y=9;
i=(x++)>(y++)?(x++:y++)

Das heist also: Nach dem Vergleich wird inkrementiert so das x danach 11 
und y 10 ist. Dann wird  x dem i zugewiesen (i =11) und danach 
inkrementiert so das x dann 12 ist (x=12) . Mit y passiert nichts 
weiteres (y=10)

Stimmt das so?

Gruß Heu

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

Das sieht so korrekt aus. Lernen solltest Du daraus:
 * Makros sind in C++ fast immer Teufelswerk. C++ hat inline-Funktionen 
oder noch besser function templates, max() und min() werden sogar 
kostenlos mitgeliefert.
 * Wenn ein durchschnittlich mittelmäßiger Programmierer länger als 2s 
über Pre-/Post-Increment und sequence points nachdenken muss, ist die 
Zeile zu kompliziert und man sollte vielleicht ein paar Zeilen mehr 
spendieren.  Der Compiler wird es sowieso optimieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.