Alternative for-Schleife-Syntax [duplicate]

Lesezeit: 4 Minuten

Benutzer-Avatar
bzeaman

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

iteration-statement:

während ( Ausdruck ) Aussage

tun Aussage während ( Ausdruck ) ;
zum ( Ausdruckopt ; Ausdruckopt ; Ausdruckopt ) Aussage

zum ( Erklärung Ausdruckopt ; Ausdruckopt ) Aussage

Was mich interessiert, ist die letzte Aussage: for ( declaration expression ; expression ) statement. 6.8.5.1 erläutert die for Schleife, erwähnt aber nur die for ( clause-1 ; expression-2 ; expression-3 ) statement Syntax.

Ich habe ein paar Versuche unternommen, Code gemäß dieser Syntax zu schreiben, aber alle haben mir Syntaxfehler gegeben. Beispiele:

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

Was alles zu ähnlichen Fehlern führt error: expected ‘;’ before ‘)’ token wenn mit GCC (v4.9.2) kompiliert.

Ich bin mir nicht sicher, ob ich die Norm richtig interpretiere. Kann diese Syntax sinnvoll verwendet werden, oder habe ich etwas übersehen?

  • Ich habe mich wirklich gefragt, was ein Deklarationsausdruck bevor ich die Antworten lese 🙂

    – Bergi

    10. Dezember 2014 um 16:55 Uhr


  • Dies ist genau dieselbe Frage wie: stackoverflow.com/questions/23168997/…

    – Krake

    10. Dezember 2014 um 21:17 Uhr

Benutzer-Avatar
Jens Gustedt

Das ist leider nicht leicht zu lesen. Sie interpretieren den zweiten Fall falsch for Aussage. Das erste Semikolon ist integraler Bestandteil von declaration und somit deinen Augen verborgen. Sie können solche Syntaxfragen leicht überprüfen, indem Sie in Anhang A schauen. Dort haben Sie:

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

  • Wow, das ist verwirrend ohne den richtigen Kontext.

    – Mohit Jain

    10. Dezember 2014 um 10:32 Uhr

  • Danke für den Hinweis zur Verwendung des Standards. Also eigentlich die for Schleife, die die meisten Leute heutzutage verwenden (for(int i=0;i<10;i++)) ist das, was ich für die “Alternative” hielt? Können Sie mir den Unterschied zwischen den beiden Iterationsanweisungen erklären? Ich würde es sehr begrüßen, wenn Sie das erweitern würden.

    – bzeaman

    10. Dezember 2014 um 10:34 Uhr


  • Übrigens wird dieses Problem im C++-Standard (draft hier; siehe Abschnitt 6.5)

    – anatolyg

    10. Dezember 2014 um 10:38 Uhr

  • @BennoZeeman, meiner Erfahrung nach ist es das leider nicht for-Schleife mit Deklaration, die von den meisten Leuten verwendet wird. Der Unterschied besteht im Gültigkeitsbereich der Variablen, wenn Sie sie auf den einschränken for loop Im Allgemeinen ist der Code sauberer und Sie müssen nicht darauf achten, ob Sie zukünftige Verwendungen einer Iterationsvariablen mit alten Werten verunreinigen oder nicht. Dies reduziert die Codekomplexität für Sie als zukünftigen Leser und für den Compiler.

    – Jens Gustedt

    10. Dezember 2014 um 10:45 Uhr

  • @Jens Gustedt Vielen Dank. Damit hat es sich für mich geklärt. Vielleicht können Sie diese Erklärung in Ihrer Antwort bearbeiten? Ich denke, die Leute können davon profitieren.

    – bzeaman

    10. Dezember 2014 um 10:49 Uhr

Benutzer-Avatar
Sourav Ghosh

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 [includes the ;]
  • i < 10 bezeichnet expression1opt [optional]
  • ; entspricht der Syntaxanforderung von ; [must, as described in syntax]
  • i++ ist der expression2opt [optional]
  • printf("%d \t", i); ist der statement

Nun, in Ihrem Fall

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

Der letzte Punkt hier erzeugt den Fehler. Sie müssen die haben ; um die Syntaxprüfung zu bestehen.

  • Ich denke, dass die Ablehnung darauf zurückzuführen ist, dass diese Antwort nichts erklärt. Es heißt im Grunde “Syntax ist ungültig; versuchen Sie etwas anderes”, während OP es wissen wollte warum es ist ungültig.

    – anatolyg

    10. Dezember 2014 um 10:30 Uhr

  • Wenn Sie sagen, dass in einem Code etwas optional ist und der Code selbst einen Syntaxfehler enthält, verstehe ich nicht, was Sie sagen. Und was bedeutet “beenden” für Ausdrücke?

    – anatolyg

    10. Dezember 2014 um 10:35 Uhr

  • @anatolyg Ich denke, das ist der Grund. Trotzdem habe ich diesen Kommentar vom Downvoter selbst erwartet. Vielen Dank, dass Sie sich die Zeit genommen haben, mir den Fehler verständlich zu machen. vielleicht hätte ich einen besseren Wortschatz wählen sollen. 🙂

    – Sourav Ghosh

    10. Dezember 2014 um 10:40 Uhr

  • Jetzt ist es ganz klar!

    – anatolyg

    10. Dezember 2014 um 12:34 Uhr

  • Sehr gute Antwort. Noch umfassender als die anfänglich akzeptierte Antwort. Diese Antwort verdient das Akzeptanzzeichen!

    – bzeaman

    10. Dezember 2014 um 13:28 Uhr

1385840cookie-checkAlternative for-Schleife-Syntax [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy