Harbison / Steeles C-Referenz besagt, dass das Ende eines vollständigen Deklarators ein Sequenzpunkt ist. Aber was ist ein vollständiger Deklarator?
"Ein vollständiger Deklarator ist ein Deklarator, der nicht Teil eines anderen ist Deklarator "
... was?
Wie wäre es zum Beispiel, würde der C-Standard garantieren, dass int i = 0, *j = &i
die Speicheradresse mit dem Wert der Variablen i
im Zeiger j
speichert?
Mit anderen Worten, ist der int i = 0
-Teil ein vollständiger Deklarator?
Nein, Sie mischen Deklarationen und Deklaratoren .
Lassen Sie mich Teile der C-Grammatik aus dem Standard zitieren:
%Vor%Und dann:
%Vor% TL; DR: int i = 0;
ist eine Deklaration . Der i
-Teil ist ein Deklarator .
Der Teil über vollständige Deklaratoren ist klar, wenn Sie zum Beispiel Zeiger haben. Diese Zeile:
%Vor% ist eine Deklaration. Der Teil *p[3]
ist der vollständige Deklarator , aber p[3]
und p
sind auch (nicht vollständige) Deklaratoren .
Und wenn Sie Ihre erste Frage stellen, ja, int i = 0, *j = &i;
ist völlig in Ordnung, weil es zwei vollständige Deklaratoren gibt: i
und *j
. Es gibt einen Sequenzpunkt am Ende jedes vollständigen Deklarators und einen weiteren Sequenzpunkt am Ende jedes Initialisierers. Du könntest sogar void *p = &p;
schreiben und es wäre gut.