Ich habe kürzlich beschlossen, dass ich endlich C/C++ lernen muss, und es gibt eine Sache, die ich nicht wirklich über Zeiger verstehe, genauer gesagt, ihre Definition.
Wie wäre es mit diesen Beispielen?
int* test;
int *test;
int * test;
int* test,test2;
int *test,test2;
int * test,test2;
Nun, nach meinem Verständnis, die ersten drei Fälle sind alle das gleiche tun: Test ist nicht ein int, aber ein Zeiger auf ein.
Die zweite Gruppe von Beispielen ist etwas komplizierter. In Fall 4 sind sowohl test als auch test2 Zeiger auf einen int, während in Fall 5 nur test ein Zeiger ist, während test2 ein "echter" int ist. Was ist mit Fall 6? Dasselbe wie in Fall 5?
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.