Warum kann nicht deklarieren Sie eine variable innerhalb des Ausdrucks Teil einer do-while-Schleife?

Gilt folgender syntax:

while (int i = get_data())
{
}

Aber das folgende nicht:

do
{
} while (int i = get_data());

Können wir sehen, warum über dem Norm-Entwurf N4140 Abschnitt 6.4:

1 [...]

Zustand: 
Ausdruck 
Attribut-specifier-seqopt decl-specifier-seq Feststellung = Initialisierer-Klausel 
Attribut-specifier-seqopt decl-specifier-seq Feststellung verspannt-init-Liste

2 Der Regeln für die Bedingungen gelten sowohl für Auswahl-Anweisungen und
der for und while Aussagen (6.5). [...]

und Abschnitt 6.5

1 Iteration Anweisungen geben Schleifen.

 iteration-Anweisung: 
while ( Zustand ) Anweisung 
do Anweisung while ( Ausdruck ) ;

Stattdessen sind Sie gezwungen, etwas zu tun, hässlich wie:

int i = get_data();
do
{
} while ((i = get_data())); //double parentheses sic

Was ist der Grund dafür?

  • Deshalb nicht, weil while Zustand liegt außerhalb der der do-while Umfang. Nun, warum können Sie nicht, die meisten wahrscheinlich wegen der Grammatik Einschränkungen.
  • Beachten Sie, dass wir finden Sie links zu den Entwurf Normen hier.
  • Hinweis: Sie können immer wrap mehr Klammern um ihn herum: { int i; do {...}while(...); }.
  • Ich glaube, dass C++, wie C, ist parseable von einem single-pass-parser, und hier wird der compiler nicht sieht, dass die Deklaration bis an das Ende der while-Schleife.
  • Ich habe eine follow-up-Frage, die hier stackoverflow.com/questions/27460527/...
InformationsquelleAutor user4351360 | 2014-12-11
Schreibe einen Kommentar