2015-07-29 13 views
7

ich zur Zeit auf jemandes anderen Code arbeite, mit einer Aussage wie diesetun, wenn() {} while() Anweisung

if(x.start()) do if(y.foo(x)) { 

// Do things 

}while(x.inc()) 

hier x benutzerdefinierte Klasse ist, die Informationen über y und ermöglicht Iteration durch sein Element hält in einer speziellen Reihenfolge. Ich habe diese Informationen, wenn relevant, aber meine Frage ist allgemeiner:

Ich dachte, dass in einer do{}while() Aussage der do Teil durch die Klammer gefolgt werden mußte, und diese togheter mit dem while() Zustand am Ende definiert die do- while-Schleife.

  • Warum können wir setzen ein if direkt nach dem do?
  • Was macht es?
  • Was kann sonst setzen zwischen do und { werden?

Ich konnte nicht zu anderen Fragen die meisten Sachen in Bezug auf diese oder auf Google, verwandte if Anweisungen innerhalb while loop zu setzen.

+3

"Ich dachte, dass in einer do {} while() -Anweisung der do-Teil von der Klammer gefolgt werden muss" ist falsch. – usr2564301

Antwort

8

Die Grammatik erlaubt jede Aussage zwischen do und while. Es ist einfach in der Regel Sie es eine besondere Form der -Anweisung - die Verbindung-Anweisung, { /* statements */ }, häufig auch ein Block bezeichnet.

Der do-while-Teil des Codes entspricht exakt

do { 
    if(y.foo(x)) { 
     // Do things 
    } 
} while(x.inc()); 
5

Die do-while-Anweisung wird die folgende Art und Weise

do statement while (expression) ; 

So zwischen dem Do und während es eine definiert sein können Anweisung einschließlich der if-Anweisung.

Was Ihre Frage

• Was sonst setzen zwischen do und können {?

Nach der Grammatik nach dem muss es eine Aussage geben. Die einzige Möglichkeit, die seltsam aussehen kann, aber gültig ist, besteht darin, ein Etikett anzubringen. Zum Beispiel

do L1: { std::cout << "Hello do-while!" << std::endl; } while (false); 

weil etikettierten Anweisungen können auch verwendet werden.

Zum Beispiel könnte die do-while-Anweisung aus Ihrer Post aussieht

if(x.start()) do Come_Here: if(y.foo(x)) { 

// Do things 

}while(x.inc()) 

berücksichtigen, dass Sie auch eine leere Anweisung verwenden.In diesem Fall wird es aussehen wie

do ; while (false); 

oder

do Dummy:; while (false); 

Und noch eine lustige Aussage

do One: do Two: do Three:; while (0); while (0); while (0); 

auch in C++ Erklärungen sind auch Aussagen. Sie können also eine Deklaration zwischen Do und While hinterlegen.

Zum Beispiel

int n = 10; 
do int i = (std::cout << --n, n); while (n); 

In C Erklärungen sind keine Aussagen. So können Sie nicht eine Erklärung zwischen der Stelle und während in C.

Und ein weiteres lustiges Beispiel

#include<iostream> 
#include <vector> 
#include <stdexcept> 

int main() 
{ 
    std::vector<int> v = { 1, 2, 3 }; 
    size_t i = 0; 

    do try { std::cout << v.at(i) << ' '; } catch (const std::out_of_range &) 
    { std::cout << std::endl; break; } while (++i); 

    return 0; 
} 

Die Programmausgabe ist

1 2 3 
0

Grammatik zu tun, während Anweisung lautet:

do-Anweisung while (Ausdruck);

Im Wesentlichen können Sie jede Anweisung nach dem Schlüsselwort do und vor dem Schlüsselwort while einfügen. Im Allgemeinen verwenden wir die Funktion do mit einer geschweiften Klammer, um die Gruppierung mehrerer Anweisungen zu ermöglichen (zusammengesetzte Anweisung). Wenn Sie jedoch nur eine Anweisung nach dem Schlüsselwort do einfügen möchten, ist die geschweifte Klammer optional. Ich würde jedoch stark empfehlen, geschweifte Klammern zu verwenden, um die Lesbarkeit zu verbessern.

In Ihrem Fall, wenn Block eine vollständige Aussage ist und es völlig in Ordnung ist.

Hier ist ein weiteres Beispiel für eine do-Anweisung, die eine einzelne Anweisung enthält.

int i = 0; 

do std::cout<<i<<std::endl; 
while (i++ < 5); 
+0

Die C++ - Grammatik wird nicht von Backus-Naur-Form beschrieben. Nenne es einfach Grammatik. –

+0

Einverstanden n bearbeitet. – Paani

0

Ich denke, dass diese Art von Einzug etwas Verwirrung verursacht.

Ich würde dies persönlich schreiben:

if(x.start()) 
    do 
     if(y.foo(x)) { 
      // Do things 
     } 
    while(x.inc()) 

Die Anweisung nach tun Klammern nicht braucht, wenn es nur eine „Linie“ ist. So wie wenn Sie nur Klammern verwenden, wenn Sie mehr Anweisungen haben. In diesem Fall sind Klammern für das if und weil das Do-while nur einen Befehl hat, verwendet er keine Klammern.

Das ist, was ich denke, wenn jemand bestätigen kann, wäre besser.

+1

Ihre Gewohnheit, Hosenträger fallen zu lassen, wird Sie eines Tages in ernsthafte Schwierigkeiten bringen. –

2

Gemäß C++ 14-Standard,

§ 6.5 Iterationsanweisungen:

§6 Statements:

labeled-statement 
expression-statement 
compound-statement (also, and equivalently, called “block”): 
    { statement-seq } 
    statement-seq: 
     statement 
     statement-seq statement 
... 

So können Sie setzen einen beliebigen gültigen Aussagen zwischen do und while

do statement while (expression); 

Wo statement sein kann.

Beachten Sie, dass in der Aussage machen die Unteranweisung ausgeführt wird wiederholt, bis der Wert des expressionfalse wird. Der Test findet nach jeder Ausführung des statement statt.