Ich habe es immer vorgezogen, Zeiger auf diese Weise zu deklarieren:
int* i;
Ich lese das so: " i
ist vom Typ int-Zeiger". Sie können mit dieser Interpretation auskommen, wenn Sie nur eine Variable pro Deklaration deklarieren.
Es ist jedoch eine unangenehme Wahrheit, dass diese Lesart falsch . Die Programmiersprache C, 2. Auflage. (S. 94) erklärt das entgegengesetzte Paradigma, das in den C-Standards verwendet wird:
Die Deklaration des Zeigers ip
,
int *ip;
ist als Gedächtnisstütze gedacht; er besagt, dass der Ausdruck *ip
ist ein int
. Die Syntax der Deklaration für eine Variable entspricht der Syntax von Ausdrücken, in denen die Variable vorkommen könnte. Diese Überlegung gilt auch für Funktionsdeklarationen. Zum Beispiel,
double *dp, atof(char *);
besagt, dass in einem Ausdruck *dp
y atof(s)
haben Werte vom Typ double
und dass das Argument der atof
ist ein Zeiger auf char
.
Nach der Logik der Sprache C bedeutet die Deklaration von
int* test, test2;
deklarieren Sie nicht zwei Variablen des Typs int*
führen Sie zwei Ausdrücke ein, die zu einem int
Typ, ohne Bindung an die Zuordnung eines int
in Erinnerung.
Ein Compiler ist durchaus in der Lage, das Folgende zu akzeptieren:
int *ip, i;
i = *ip;
denn im C-Paradigma wird vom Compiler nur erwartet, dass er den Verlauf der Typ von *ip
y i
. Vom Programmierer wird erwartet, dass er den Überblick über die Bedeutung von *ip
y i
. In diesem Fall, ip
ist nicht initialisiert, so dass es in der Verantwortung des Programmierers liegt, auf etwas Sinnvolles zu verweisen, bevor es dereferenziert wird.
19 Stimmen
In C/C++ ändern Leerzeichen die Bedeutung nicht.
38 Stimmen
7.
int*test;
?4 Stimmen
+1, denn ich hatte nur daran gedacht, nach 1 - 3 zu fragen. Beim Lesen dieser Frage habe ich etwas über 4 - 6 gelernt, woran ich nie gedacht hatte.
0 Stimmen
@Sulthan Das stimmt in 99 % der Fälle, aber nicht immer. Von der Spitze von meinem Kopf gab es die Art der schablonenartigen Typ in schablonenartigen Typ Raum Anforderung (vor C++11). In
Foo<Bar<char>>
die>>
musste geschrieben werden> >
um nicht als Rechtsverschiebung behandelt zu werden.4 Stimmen
@AnorZaken Sie haben recht, das ist ein ziemlich alter Kommentar. Es gibt mehrere Situationen, in denen ein Leerzeichen seine Bedeutung ändert, zum Beispiel das Inkrement
++
Operator nicht durch ein Leerzeichen getrennt werden kann, können Bezeichner nicht durch ein Leerzeichen getrennt werden (und das Ergebnis kann für den Compiler immer noch legal sein, aber mit undefiniertem Laufzeitverhalten). Die genauen Situationen sind sehr schwer zu definieren, wenn man bedenkt, was für ein Syntaxchaos C/C++ ist.0 Stimmen
@Sulthan ja, diese Fälle, die Sie jetzt erwähnen, sollten ziemlich offensichtlich sein, ich meinte, dass es ein paar nicht offensichtliche Fälle gibt, wo ein Leerzeichen ist erforderlich . Wie auch immer, ich wollte diese Anmerkung nur zu Protokoll geben, sie war nicht als Kritik an Ihrem Kommentar gedacht.
1 Stimmen
@JinKwon: Whitespace ist nur notwendig, um Token zu trennen, die sonst nicht unterschieden werden können. Da
*
nicht Teil eines Bezeichners ist (es ist ein eigenständiges Token), ist kein Leerzeichen zur Abtrennung vonint
,*
ytest
. Er wird immer noch geparst alsint (*test)
.5 Stimmen
Ich verstehe nicht, warum immer wieder behauptet wird, dies sei "nur Ästhetik" oder "Stil" oder "eine Frage der Meinung". Die Tatsache, dass
int* test,test2;
nicht das tut, was man erwarten würde, bedeutet, dass es falsch ist, ein Ergebnis eines Missverständnisses der Sprache, und dassint *test,test2;
ist richtig.1 Stimmen
...und dass
int* test; int test2;
ist richtig.0 Stimmen
Ich denke, das war ein weiterer Grund, warum intelligente Zeiger entwickelt wurden. Um das Sternchen überhaupt zu vermeiden.