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-Liste2 Der Regeln für die Bedingungen gelten sowohl für Auswahl-Anweisungen und
derfor
undwhile
Aussagen (6.5). [...]
und Abschnitt 6.5
1 Iteration Anweisungen geben Schleifen.
iteration-Anweisung:while
( Zustand ) Anweisungdo
Anweisungwhile
( 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 derdo-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/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie es scheint, scoping wäre die Frage, was wäre der Umfang der
i
erklärt in derwhile
Teil einerdo while
Aussage? Es scheint eher unnatürlich, um eine variable innerhalb der Schleife, wenn die Erklärung ist eigentlich unter der Schleife selbst. Sie don ' T haben dieses Problem mit den anderen loops, da die Erklärungen kommt, bevor der Körper der Schleife.Wenn wir uns die Entwurf der C++ - standard Abschnitt [stmt festgelegt.während]p2 wir sehen, dass für die while-Anweisung, dass:
ist äquivalent zu:
und:
Wie würden wir formulieren diese für die
do while
Fall?und als cdhowie Punkte aus, wenn wir uns an Abschnitt [stmt festgelegt.tun], p2 es sagt (Hervorhebung von mir):
was bedeutet, dass der Körper der Schleife ausgewertet wird, bevor wir überhaupt erreichen würde die Erklärung.
Während wir erstellen könnten, eine Ausnahme für diesen Fall würde es gegen unsere intuitiven Sinn, dass im Allgemeinen der Punkt, der Deklaration für ein name ist, nachdem wir die vollständige Erklärung (- mit einigen Ausnahmen-beispielsweise für Variablen in einer Klasse) mit unklarer nutzen. Punkt der Erklärung bedeckt ist, die in Abschnitt
3.3.2
.i
innerhalb einerfor()
Schleifen Körper. Die ratioale muss etwas anderes sein.Es gibt mehrere Gründe, warum es schwierig wäre, zu ermöglichen.
Die Sprache hält sich an die Regel, dass alles, was erklärt werden sollte oben der Punkt der Nutzung. In diesem Fall wird die variable deklariert, in
do-while
würde deklariert werden unten wird die erwartete Natürliche Rahmen (der Zyklus Körper). Machen Sie diese variable zugänglich im Zyklus würde haben benötigt eine spezielle Behandlung fürdo-while
Zyklen. Auch wenn wir wissen, Beispiele für eine solche spezielle Behandlung (z.B. in-class-member-Funktion stellen alle Schüler, auch diejenigen, die erklärt unten), gibt es wahrscheinlich nicht viel praktischen Sinn, es zu tun, fürdo-while
Zyklen.Im Falle von
do-while
diese spezielle Behandlung Regeln würde auch erfordern zu finden eine sinnvolle Art des Umgangs mit der Initialisierung der deklarierten Variablen in dieser Art und Weise. Beachten Sie, dass in C++ - Sprache die Lebensdauer solcher Variablen beschränkt sich auf eine iteration der Schleife, d.h. die variable, die erstellt und zerstört, auf jeder iteration. Das bedeutet, dass fürdo-while
Zyklus die variable immer bleiben wird nicht initialisiert, es sei denn, Sie stellen einige Regel irgendwie verschieben der Initialisierung der Anfang von der Schleife. Das wäre ziemlich unübersichtlich meiner Meinung nach.Es wäre sehr unnatürlich, um eine Erklärung der
i
nach dem block und dann in der Lage sein, um es in den block. Erklärung infor
undwhile
sind schön kurz-Hände, die geben, beschränkt-Rahmen verwenden, um eine variable, die benötigt wird in der loop-Logik.Cleaner, um es zu tun auf diese Weise:
Dies ist, weil alles andere folgt die Praxis der Deklaration von Variablen, bevor Sie Sie verwenden, wie zB:
Dies ist, weil die Dinge analysiert werden, top-down, und weil diese Konvention hält die Dinge intuitiv so, warum können Sie erklären eine ganze Weile(int var < 10), weil der Umfang der var wird der Bereich innerhalb der Schleife, nach der Erklärung.
Do while macht keinen Sinn, eine variable zu deklarieren, weil der Rahmen wäre Ende in der gleichen Zeit, es würde überprüft werden, da, wenn der block fertig ist.
Fügen Sie diese
am Anfang des Codes.
Nun, Sie können schreiben,
Ist es wichtig, dass diese
#define
bricht nicht die ursprüngliche syntax derdo
Schlüsselwort in der do-while-Schleife.Allerdings, ich gebe zu, es ist unklar.
Ihre erste syntax ist gültig, während die zweite nicht.
Aber deine while-Schleife wird die Schleife für immer, auch wenn Ihre Funktion get_data() gibt 0 zurück.
Nicht sicher, ob das ist genau das, was Sie wollen passieren.