Definition im if/while statement



  • Wo steht eigentlich im Standard, dass man das hier darf,

    if (int i = 0);
    while (int i = 0);
    

    aber nicht das hier:

    if ((int i = 0));
    while ((int i = 0));
    

    ? (Würde mich auch für C++ interessieren.)
    Falls es keine passende Stelle gibt: Aus welchen Regeln ergibt sich das denn?



  • Falscher Code ist falsch.



  • Im C++ Standard (n3242) sind die Regeln ab 6.4/1 "Selection statements" beschrieben. Dass das funktioniert ergibt sich aus Sonderregeln, nicht aus sonstigen grammatikalischen Eigenschaften.

    z.B.

    n3242 6.4/1 Selection statements schrieb:

    selection-statement:
      if ( condition ) statement
      if ( condition ) statement else statement
      switch ( condition ) statement
    condition:
      expression
      attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause // <-
      attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list // <-
    

    In C geht das glaube ich gar nicht, zumindest nicht in C89.


  • Mod

    cooky451 schrieb:

    In C geht das glaube ich gar nicht, zumindest nicht in C89.

    Wir haben aber 2012 und schon zwei Überarbeitungen des Standards, die das beide erlauben.



  • cooky451 schrieb:

    Im C++ Standard (n3242) sind die Regeln ab 6.4/1 "Selection statements" beschrieben. Dass das funktioniert ergibt sich aus Sonderregeln, nicht aus sonstigen grammatikalischen Eigenschaften.

    z.B.

    n3242 6.4/1 Selection statements schrieb:

    selection-statement:
      if ( condition ) statement
      if ( condition ) statement else statement
      switch ( condition ) statement
    condition:
      expression
      attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause // <-
      attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list // <-
    

    In C geht das glaube ich gar nicht, zumindest nicht in C89.

    Nun expression ist der Oberbegriff/Wurzel in den man bis zu Klammerung und Assignment abspringen könnte.



  • SeppJ schrieb:

    Wir haben aber 2012 und schon zwei Überarbeitungen des Standards, die das beide erlauben.

    Bei denen war ich mir nicht ganz sicher. Allerdings: http://ideone.com/4zgv8
    Ein C11 Compiler steht mir leider nicht zur Verfügung.

    Zeus schrieb:

    Nun expression ist der Oberbegriff/Wurzel in den man bis zu Klammerung und Assignment abspringen könnte.

    Äh.. ne. Also ne, wenn ich dich richtig verstanden habe.



  • cooky451 schrieb:

    Zeus schrieb:

    Nun expression ist der Oberbegriff/Wurzel in den man bis zu Klammerung und Assignment abspringen könnte.

    Äh.. ne. Also ne, wenn ich dich richtig verstanden habe.

    Stimmt das ist eine Deklaration 😃



  • SeppJ schrieb:

    cooky451 schrieb:

    In C geht das glaube ich gar nicht, zumindest nicht in C89.

    Wir haben aber 2012 und schon zwei Überarbeitungen des Standards, die das beide erlauben.

    Welche denn? C99 jedenfalls nicht.


  • Mod

    Bashar schrieb:

    SeppJ schrieb:

    cooky451 schrieb:

    In C geht das glaube ich gar nicht, zumindest nicht in C89.

    Wir haben aber 2012 und schon zwei Überarbeitungen des Standards, die das beide erlauben.

    Welche denn? C99 jedenfalls nicht.

    😕 Irgendwie scheine ich bei meiner Antwort das Thema des Threads verfehlt zu haben.


Anmelden zum Antworten