003
27.02.2009, 00:59 Uhr
0xdeadbeef
Gott (Operator)
|
++ und -- binden in jedem Fall stärker als *. Postfix bindet dabei stärker als Präfix, wobei das eher selten von praktischer Bedeutung ist. Wikipedia hat eine sehr nützliche Tabelle, in der das aufgelistet ist.
Der Unterschied zwischen ++ und +1 ist, dass ++ die Variable verändert (komische Operatorüberladungen in C++ mal ausgenommen), während cpp + 1 das unterlässt.
Kleiner technischer Exkurs: Man kann hier zwar vereinfachend von einer Kopie reden, insofern, als dass eine Kopie des Zeigers im Register verändert wird, allerdings ist das beim Präinkrement ebenfalls der Fall. Der eigentliche Unterschied ist, dass der veränderte Wert beim Präinkrement nachher wieder an die selbe Stelle im Speicher zurückgeschrieben wird. Um es in grob fahrlässiger Weise mal in C-Pseudocode zu fassen (der mit einiger Wahrscheinlichkeit völlig anderen asm-Code erzeugen würde, aber es geht ja nur ums Prinzip):
C++: |
int x; register int r;
// Addition x = 0; r = x + 1;
// Inkrement x = 0 r = x + 1; x = r;
|
Oh, und zur Aufgabenstellung ist noch anzumerken, dass
C++: |
char *cp[]={"GERICHT", "SEIN", "MODE"};
|
falsch ist, weil es cv-Qualifier entfernt (in diesem Fall const). Die Strings sind konstant, und der Speicher, in dem sie liegen, gehört dir nicht. In C ist es lediglich unschön (solange du nicht versuchst, da reinzuschreiben), die Sprache ist in diesem Zusammenhang ziemlich nachsichtig, aber ein strenger C++-Compiler haut dir sowas um die Ohren - besser ist in jedem Fall
C++: |
char const *cp[]={"GERICHT", "SEIN", "MODE"};
|
und dann entsprechend
C++: |
char const **cpp = cp;
|
...damit die Zuweisung an cpp den const-Qualifier von cp nicht wegschmeißt. Der const-Qualifier bezieht sich auf den Ausdruck direkt zu seiner linken, d.h., die Zeichen werden als Konstanten gehandhabt (was sie ja sind), während die Zeiger variabel bleiben; der restliche Code funktioniert also nach wie vor.
Für den Fall, dass dein Professor dir die recht gebräuchliche, aber in meinen Augen etwas inkonsistente
C++: |
const char *p = "foo";
|
-Notation beigebracht hat, das ist das selbe wie
C++: |
char const *p = "foo";
|
. Es handelt sich um einen syntaktischen Sonderfall - wenn const ganz links steht, bezieht es sich auf den Ausdruck direkt zu seiner rechten, weil ja zur linken keiner vorhanden ist. Das führt dann bei Zeigerkonstanten zu etwas unintuitiven Ausdrücken wie
C++: |
const char *const p = "foo";
|
Ich schreibe sowas lieber als
C++: |
char const *const p = "foo";
|
...der Übersicht halber. Beide Ausdrücke sind äquivalent, aber du siehst vielleicht, warum ich mir angewöhnt habe, const nicht ganz links hinzuschreiben. Man kommt auf die Art nicht in Versuchung, Dinge wie
C++: |
const char const *p = "foo"; // ARGH!
|
zu versuchen, die überhaupt keinen Sinn ergeben (hier wäre char quasi doppelt const, was auch immer das bedeuten soll). -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 27.02.2009 um 01:09 Uhr von 0xdeadbeef editiert. |