it-swarm.dev

Was ist der Begriff für "while (true)" -Schleife mit "break" im Inneren?

Angenommen, ich habe eine Schleife in C++ oder C #, die folgendermaßen aussieht:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

Dies wird allgemein als "Endlosschleife" bezeichnet. Es ist jedoch technisch nicht unendlich - es stoppt, sobald die Steuerung durch break fließt.

Was ist der Begriff für eine solche Schleife - die eine Schleifensteueranweisung "Schleife für immer" und "Unterbrechung" enthält?

25
sharptooth

Als er CS studierte, lehrte uns dieser Professor, dass es Vorprüfschleifen (while(cond) {}), - gibt. Nachprüfschleifen (do {} while(cond);) und mittlere Prüfschleifen . (Ich hätte das vielleicht schlecht ins Englische übersetzt, aber Sie haben die Idee.)

C und C++ haben letzteres nicht (ISTR Ada hat es, BICBW), daher wird Ihr Konstrukt in C und C++ dafür verwendet.

24
sbi

Der allererste CS-Kurs in Stanford ( Programmiermethode von Mehran Sahami ) bezeichnet dies als eineinhalb Schleifen. Und es ist nicht unbedingt eine schlechte Programmierpraxis. Betrachten Sie dieses Beispiel zum Sammeln von Benutzereingaben (entnommen aus Die Kunst und Wissenschaft von Java von Eric Roberts , wobei Roberts es auch a-loop-and nennt) -a-half):

Prompt user and read in the first value
while (value != sentinel) {
    process the data value
    Prompt user and read in a new value
}

Und dann wurde das Gleiche mit der Idee anderthalb Schleifen gelöst, um doppelten Code zu vermeiden:

while (true) {
    Prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}
13
user43142

Ohne offiziellen Namen würde ich es Broken Loop nennen. Die Mehrdeutigkeit dieses Begriffs ist beabsichtigt, da eine Unterbrechung in der Mitte einer Schleife etwas unrein ist, fast wie ein goto.

10
user281377

Es gibt keinen endgültigen Namen. Endlosschleife ist meiner Meinung nach der passende Begriff. Keine Schleifen sind wirklich unendlich, aber dies kann effektiv unendlich sein, da es möglich ist, dass der Zweig, der die Unterbrechung enthält, niemals auftritt.

Wenn Sie jemandem sagen "Erstellen Sie eine Endlosschleife und verwenden Sie eine Pause für Bedingung X", wird er wissen, was Sie meinen. Wenn jemand Ihren Code überprüft und nichts weiter sagt als "Ich mag die Endlosschleife, die Sie geschrieben haben, nicht", wissen Sie, wovon er spricht (es sei denn, Sie haben natürlich mehr als eine).

8
Bryan Oakley

Es ist eine Do-While-Schleife mit der Bedingung an der falschen Stelle.

8
Malfist

Ich würde für "bedingungslose Schleife" stimmen, ähnlich wie "bedingungsloser Sprung". Es zeigt genau, was los ist (der Code schleift bedingungslos), ohne zu lügen (im Gegensatz zu "Endlosschleife").

6
tdammers

Was ist der Begriff für eine solche Schleife - die eine Schleifensteueranweisung "Schleife für immer" und "Unterbrechung" enthält?

Es ist eine Endlosschleife mit einer Unterbrechungsbedingung.

Ich würde ammilind darin zustimmen, dass man, wenn man ihm einen speziellen Namen geben wollte, es Infinite Partial Loop nennen könnte

5
Ramhound

In Rosetta Code wird dieses spezielle Muster als "N plus eine halbe" Schleife beschrieben. Es ist zwar nicht mein Lieblingsbegriff, aber nicht schrecklich und eindeutig ein Muster, das für einige Arten von Schleifen nützlich ist. (Die Alternativen bestehen darin, den Code vor der Bedingung zu duplizieren - was in realen Programmen möglicherweise schwierig ist - oder die Verschachtelungstiefe des Codes nach der Bedingung zu erhöhen, während eine Schleifenbedingungsvariable hinzugefügt wird. Dies verbessert weder die Wartbarkeit noch die Verständlichkeit des Codes Der einzige Grund, solche Konstrukte abzulehnen, ist, wenn man darauf besteht, Schleifen zu schreiben, um break- frei zu sein.)

5
Donal Fellows

Es gibt keinen Standardbegriff, aber ich würde ihn als Teilschleife sagen.

Diese Schleife wird verwendet, wenn Sie erst nach ein letztes Mal einen Teil der Schleife ausführen (d. H. Teilausführung) unterbrechen möchten. Es wird verwendet, wenn Sie keine geeignete Situation finden, in der Sie möglicherweise die gesamte Schleife unterbrechen möchten.

In diesem Fall möchten Sie die Schleife unterbrechen, nachdem Sie mindestens doSomething() ein letztes Mal ausgeführt haben.

4
iammilind

Ich muss hier sbi zustimmen - ich mag den Begriff mittlere Kontrollschleife. Diese Art von Konstrukt war populärer, als die strukturierte Programmierung begann und viele Sprachen syntaktische Unterstützung für sie hatten.

Das heißt, es ist mittlerweile weit verbreitet, dass while - Schleifen normalerweise besser zu handhaben sind, da es einfacher ist, über Invarianten nachzudenken, und sie den schwierigen leeren Fall oft besser handhaben.

In Ihrem speziellen Fall entspricht Ihre Schleife nur

for(; doSomething(), !condition(); doSomethingElse()){}

daher würde ich die Version break nur verwenden, wenn entweder doSomething oder doSomethingElse mehrere Anweisungen enthalten und ich sie lieber nicht wie Sie in separate Funktionen verschieben möchte.

Das heißt, wenn Ihre Schleife komplizierter ist als eine (Start-, Überprüfungs-, Inkrementierungs-) Iteration, sollten Sie in Betracht ziehen, sie in etwas Einfacheres umzugestalten.

2
hugomg

Ich denke, wenn wir versuchen werden, einen Begriff dafür zu finden, vielleicht:

Fluchtbare Schleife

1
LarsTech

Ich nenne es so, wie es ist, eine "while true loop".

Siehe auch ist während (wahr) schlechte Programmierpraxis?

0
Bratch

Es ist nicht in jedem Fall so schlimm. Ich schreibe diese Art von Loops mit bestimmten APIs. Nehmen wir zum Beispiel an, Sie haben ein Schleifenobjekt und müssen nach einer Bedingung suchen, die ziemlich tief darin liegt, wie folgt:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

Angenommen, jede getXXX-Methode könnte möglicherweise null zurückgeben. Dann wäre es immer noch möglich, einen booleschen Ausdruck zu schreiben, obwohl dieser ziemlich kompliziert und unlesbar ist. Und dann müssen wir fast dasselbe wiederholen, um zum aktuellen Handler-Objekt zu gelangen. In solchen Fällen fällt es mir leichter, eine while (true) - Schleife mit break zu schreiben und fortzufahren.

0
Ingo