Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Makros verstehen lernen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.12.2009, 22:22 Uhr
cpplearner



Hallo liebe C++-Gemeinde,

momentan habe ich ein echtes Verständnis-Problem bei folgendem Programm zum Thema Makros:

C++:
#include <iostream>
using namespace std;

#define CUBIC(x) (x * x * x)

int main (void)
{
        int x = 2;
    cout << "Ergebnis = " << CUBIC(x++) << endl;
    
    x = 2;
    cout << "Ergebnis = " << CUBIC(++x) << endl;
    
    x = 2;
    cout << "Ergebnis = " << CUBIC(x--) << endl;
    
    x = 2;
    cout << "Ergebnis = " << CUBIC(--x) << endl;
    
    return 0;
}



Normalerweise müsste mir dieses Programm doch die Ergebnisse 8, 27, 8 und 1 liefern.
Jedoch kommen ganz andere Zahlen heraus, als gedacht. Kann mir jemand von euch erklären, wo mein Denkfehler ist, bzw. wie ich die Ergebnisse, die mir mein Compiler ausspuckt nachvollziehen kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.12.2009, 22:40 Uhr
ao

(Operator)



C++:
    int x = 2;
    cout << "Ergebnis = " << CUBIC(x++) << endl;


Präprozessor-Makros sind keine Funktionen. Der Präprozessor ersetzt nur ein Stück Text durch ein anderes. Daher expandiert das hier zu:

C++:
    int x = 2;
    cout << "Ergebnis = " << (x++ * x++ * x++) << endl;
    // (1)


In welcher Reihenfolge die Inkrementierungen und die Multiplikationen ausgeführt werden, ist dem Compiler überlassen. Einzige verbindliche Regel: Am "Sequenzpunkt" (hier das Semikolon) müssen alle Berechnungen abgeschlossen sein. An der Stelle (1) ist x also gleich 5.

Wirds davon klarer?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.12.2009, 00:23 Uhr
cpplearner



Aha, so funktioniert das. Vielen Dank für die gute Erklärung.

Für die Aufrufe von CUBIC gilt dann:

CUBIC(x++) = (x++ * x++ * x++) = 2 * 3 * 4 = 24
CUBIC(++x) = (++x * ++x * ++x) = 3 * 4 * 5 = 60

CUBIC(x--) = (x-- * x-- * x--) = 2 * 1 * 0 = 0
CUBIC(--x) = (--x * --x * --x) = 1 * 0 * -1 = 0

Danke nochmal.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2009, 00:26 Uhr
0xdeadbeef
Gott
(Operator)


Nicht ganz - * ist kein Sequenzpunkt, also kann der Compiler selbst bestimmen, wann die Nebeneffekte (erhöhen oder erniedrigen) ausgeführt werden. Die Ergebnisse der Ausdrücke sind dementsprechend undefiniert und vom Compiler abhängig.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2009, 10:54 Uhr
cpplearner



Ok, jetzt wird mir klar, wie's funktioniert. Vielen Dank für eure Hilfe. Dieses Forum hier ist echt super!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: