2016-07-12 22 views
7

In diesem Beitrag: https://stackoverflow.com/questions/38326930/cannot-read-full-100000-integer-values-from-a-file-in-cIst es zulässig, den Größenteil eines VLA in demselben Sequenzpunkt zu initiieren, wie der VLA deklariert wird?

Die OP-Code enthält, wo es mit viel falsch, aber 1 Linie hat mich besonders Kuriosität, da ich nicht in der Lage war, etwas nach oben zu schauen, ist es nicht anzuerkennen.

Dies ist die spezifische Zeile:

int n = 100000, arr[n]; 

Ist die Reihenfolge der Deklaration und Initialisierung gewährleistet beeing?

Also hier würde ich annehmen, es könnte sogar passieren, dass n wurde nicht initialisiert, wenn arr erklärt wird, was offensichtlich nicht gut wäre.

Aber ich konnte im iso/iec 9899 draft weder eine Aussage dazu finden noch sie undefiniert nennen oder definieren.

So ist das, wie ich vermute nicht definiert Verhalten? Oder ist es?

Und so oder so, was die Regel für das Ergebnis wird gerade uses 5

Edit:?

Ist das gilt für C99, auch?

+0

In dieser Zeile befindet sich kein _comma-Operator_. Eine Deklaration ist keine Aussage! – Olaf

+0

@Olaf: Ah, du hast Recht, ich habe schon gelernt, dass hier das Komma eine andere Arbeit macht. Aber verändert das das Ergebnis? stellt die Trennung von Kommata in einer Deklaration die Reihenfolge sicher? – dhein

+0

Die Bearbeitung zurückgerollt. Bitte bearbeiten Sie keine Frage, nachdem Sie eine Antwort erhalten haben, dass die Antwort Kontext verliert. – Olaf

Antwort

-1

Kurz gesagt: Ihr Code ist korrekt. Es ist deine Prämisse, die falsch ist. Die beiden Deklarationen sind nicht "in der gleichen Reihenfolge". (Als Nebenbemerkung: Es kann nichts geben in einen Punkt, aber nur zwischen zwei Punkten, Punkte sind dimensionslos).

Die Details:

6.8.2 des Standard die Grammatik einer Verbindung Rechnung zeigt, welche die Grundlage jeder Funktionskörper ist:

compound-statement: 
    { block-item-listopt } 
block-item-list: 
    block-item 
    block-item-list block-item 
block-item: 
    declaration 
    statement 

Relevant ist hier der Block-Artikel. Wie gezeigt, kann es eine Erklärung oder eine Erklärung sein. Dies bedeutet, dass eine Deklaration keine Anweisung ist. Sie zeigen eine Erklärung, so dass die , keinen Operator hier ist, aber trennt die init-Deklaratoren (ein declarator optional mit einer initialiser, 6.7 für die Grammatik sehen). Und es gibt einen Sequenzpunkt direkt nach dem Deklarator (und vor dem optionalen Initialisierer, btw.).

6.7.6p3: Ein vollständiger Deklarator ist ein Deklarator, der nicht Teil eines anderen Deklarators ist. Das Ende eines vollständigen Deklarators ist ein Sequenzpunkt. Wenn in der verschachtelten Sequenz von Deklaratoren in einem vollständigen Deklarator ein Deklarator einen Array-Typ variabler Länge angibt, wird der vom vollständigen Deklarator angegebene Typ als variabel definiert. Darüber hinaus wird jeder Typ, der durch Deklarator-Typ-Ableitung von einem variabel modifizierten Typ abgeleitet wird, selbst variabel modifiziert.

In Bezug auf die "Ausführungsreihenfolge": Das ist eigentlich die Umsetzung überlassen. Aber der Standard erfordert, der abstrakten Maschine zu folgen. Sequenzpunkte sind das fundamentale Ordnungskonzept.


Die Frage bezieht sich eigentlich nicht direkt auf VLAs, sondern allgemein auf Deklaratoren. Ohne die Abschnitte aller vorherigen Versionen zu zitieren, ist das Verhalten in allen Versionen identisch, weil sonst etwas wie auch nicht funktionieren würde (es tut).

+2

Was hast du daraus gemacht? Ich habe mir auch das Material angesehen, auf das Sie sich vor dem Posten beziehen, aber ich kann immer noch nicht sehen, wo das steht. – dhein

+0

@Zaibis: Sorry, ich habe den falschen Absatz gefangen. Siehe die Änderung. – Olaf

+0

@Olaf: interessant. Auf welche Version des Dokuments verweisen Sie? Als ich mein Dokument vollständig durchsucht habe, indem ich nach "Array variabler Länge" gesucht habe, habe ich diesen Absatz nicht gefunden. – dhein