2012-08-02 3 views
6

, wie ich eine While-Schleife tun:Ist es möglich, Variablen innerhalb einer Bedingung zu deklarieren? Dies ist

boolean more = true; 
while (more) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

Die ziemlich Standard ist. Ich bin neugierig, ob es einen Weg gibt, etwas ähnlich dem folgenden Code in Java zu tun: (Ich glaube, ich so etwas wie es in C gesehen habe)

// The code below doesn't compile (obviously) 
while (boolean more = true) 
{ 
    // do something 
    if (someTest()) 
    { 
    more = false; 
    } 
} 

ich dies nur fragen, weil zur Zeit I don‘ t wie die Art, wie ich die Variable in der Bedingung (in diesem Fall: "mehr") definiert außerhalb den Umfang der Schleife, obwohl es nur relevant ist innerhalb der Schleife. Es hat keinen Sinn, dass es nach dem Ende der Schleife herumhängt.


* * Update * *

Eine Idee kam ich nach einem Besuch in der Porcaline Kammer des Schreckens:

for (boolean more=true; more; more=someTest()) 
{ 
    // do something 
} 

Es ist nicht perfekt; Es missbraucht die for-Schleife und ich kann mir keinen Weg vorstellen, die Schleife mindestens einmal auszuführen, aber es ist nah ... Gibt es eine Möglichkeit, sicherzustellen, dass die Schleife 1+ mal durchgeführt wird?

+1

for (boolean more = true; mehr; more = someTest()) ... wird immer mindestens einmal ausgeführt. – Pyrce

Antwort

9

Ihre Frage wahrsten Sinne des Wortes zu beantworten, Sie

for(boolean more = true; more;) { 
    more = !someTest(); 
} 

tun können, aber das ist sehr ähnlich wie

while(!someTest()); 

Wenn es Sie

tun können, mindestens einmal ausführen müssen
do { 

} while(!someTest()); 
+2

' für (var; cond;) 'Trick ist nützlich im Umgang mit Iteratoren:' für (Iterator it = list.iterator(); it.hasNext();) {/ * do stuff */} '. In der Tat wird es empfohlen in * Effektives Java-Objekt 45: Minimieren Sie den Umfang der lokalen Variablen * – Xaerxess

+0

Ihre Antwort tauchte auf, als ich mein Update einreichte. Vielen Dank! ... Es war wahrscheinlich eine schlechte Idee meinerseits die Bedingung als Methode zu abstrahieren - die Schleife hatte nur drei Zeilen und eine davon war "mehr" gesetzt, so dass es in einer Methode eingekapselt werden würde, wäre übertrieben. Ich dachte, es würde die Frage prägnanter machen, aber offen bleiben für Fehlinterpretationen. Mein Fehler. – KidTempo

1

Für Ihren speziellen Fall können Sie Ihren Code dies reduzieren:

while (true) { 
    if (someTest()) { 
    break; 
    } 
} 

Im Allgemeinen Sie Ihre äußeren Umfang Deklaration mit einem Innenumfang ein, ersetzen könnten, aber sie würde die bewegen müssen Schleifenbedingung:

while (true) { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} 

Oder auch:

do { 
    boolean more=true; 
    ... 
    if (someTest()) { 
    more = false; 
    } 
    ... 
    if (!more) { 
    break; 
    } 
} while (true); 

ich würde meinen, dass Ihr Zustand OUTSI definieren de Die Schleife ist klarer.

+0

+1 oder 'while (! SomeTest()) {}' –

+0

um ehrlich zu sein, ich bin kein großer Fan der Verwendung von 'while (true) {...}' es scheint wie ein bisschen ein Cop-out . Außerdem habe ich immer noch Albträume von Debuggen von Spaghetti-Code anderer Leute, die mit riesigen Blöcken von "if (false)"} '[Schauer] – KidTempo

0

KidTempo, in dem Beispiel, das Sie gaben, denke ich, dass mehr jedes Mal durch die Schleife neu initialisiert werden würde. Jedes Mal, wenn die Schleife durchlaufen wird, wird die Bedingung erneut ausgewertet. Wenn Sie also eine Variable in einer Bedingung definieren können, wird die Variable jedes Mal neu initialisiert, wenn diese Bedingung erneut ausgewertet wird. Dies würde auch für andere Arten von Bedingungen gelten, also würde ich sagen, dass man Variablen in einem Konditional nicht definiert.

Verwandte Themen