2014-12-10 21 views
34

Unten ist ein Ausschnitt des C-Standards (Abschnitt 6.8.5 des n1256 TC3 C99).Alternative For-Loop-Syntax

Iteration-Anweisung:
        während(Ausdruck)Anweisung
        tunAnweisungwährend(Ausdruck);
        für(Ausdruck opt; Ausdruck opt; Ausdruck opt)Anweisung
        für(ErklärungAusdruck opt; Ausdruck opt)Anweisung

Was mein Interesse weckt ist die letzte Anweisung: for (declaration expression ; expression) statement. 6.8.5.1 erklärt die for Schleife, erwähnt aber nur die for (clause-1 ; expression-2 ; expression-3) statement Syntax.

Ich habe ein paar Versuche gemacht, Code nach dieser Syntax zu schreiben, aber sie alle gaben mir Syntaxfehler. Beispiele:

for (int i = 0, i; i++) { /* ... */ } 
for (int i = 0; !(i++)) { /* ... */ } 

, die alle Ergebnisse in Fehlern ähnlich wie error: expected ‘;’ before ‘)’ token bei der Verwendung von GCC (v4.9.2) zusammengestellt.

Ich bin nicht sicher, ob ich den Standard in der richtigen Weise interpretiere. Kann diese Syntax nützlich sein oder habe ich etwas übersehen?

+2

ich wirklich eine * Erklärung Ausdruck gefragt, was * sein wouldd vor :-) – Bergi

+1

die Antworten zu lesen ist dies genau die gleiche Frage wie: http://stackoverflow.com/questions/23168997/is-there-a-way-to-create-a-for-loop-with-only-two-expressions-in-c – Octopus

Antwort

30

Wenn Sie sehen, ist die Syntax,

for (declaration expression1opt ; expression2opt) statement 

Vergleichen wir es mit einer allgemeinen Aussage

for (int i = 0; i < 10; i++) printf("%d \t", i); 

Hier

  • int i = 0; bezeichnet declaration [enthält die ;]
  • i < 10 bezeichnet expression1opt [optional]
  • ; ist gemäß der Syntax Erfordernis ; [müssen, wie in der Syntax beschrieben]
  • i++ ist die expression2opt [optional]
  • printf("%d \t", i); Das Jetzt ist statement

in Ihrem Fall

for (int i = 0, i; i++) { /* ... */ } 
  • int i = 0, i; bezeichnet declaration
  • i++expression1opt
  • ; ist bezeichnet fehlt .....

Der letzte Punkt ist hier der Fehler produziert. Sie müssen die ; haben, um die Syntaxprüfung zu bestehen.

+0

und der Grund für den Downvote? –

+10

Ich vermute, dass der Downvote war, weil diese Antwort nichts erklärt. Es sagt im Grunde "Syntax ist ungültig; versuchen Sie etwas anderes", während OP wollte wissen * warum * es ist ungültig. – anatolyg

+0

@anatolyg ok Herr, so was muss ich hinzufügen. kannst du bitte vorschlagen? –

40

Leider ist dies nicht leicht zu lesen. Sie lesen den zweiten Fall der for-Anweisung falsch. Das erste Semikolon ist ein integraler Bestandteil von declaration und somit für Ihre Augen verborgen. Sie können ganz einfach solche Syntax Fragen überprüfen, indem Sie in Anhang A. suchen Dort haben Sie:

(6.7) declaration: 
    declaration-specifiers init-declarator-listopt ; 
    static_assert-declaration 
+5

wow, das ist ohne richtigen Kontext verwirrend. –

+1

Danke für den Hinweis zur Verwendung des Standards.Also, eigentlich ist die 'for' -Schleife, die die meisten Leute heutzutage benutzen (' für (int i = 0; i <10; i ++) '), was ich für die" Alternative "hielt? Können Sie mir den Unterschied zwischen den beiden Iterationsanweisungen erklären? Ich würde es wirklich schätzen, wenn Sie das weiter ausführen. – bzeaman

+0

Übrigens wird dieses Problem auch im C++ - Standard (Entwurf [hier] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3690.pdf) erklärt, siehe Abschnitt 6.5) – anatolyg