Unterschied zwischen Do...Loop While und Do...Loop Until

  • VB6

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Unterschied zwischen Do...Loop While und Do...Loop Until

    Hey Leute,
    Ich schreibe morgen in Info eine KA und muss dafür dringend wissen, was der Unterschied zwischen Do...Loop While und Do...Loop Until Schleifen ist. Wir programmieren grade mit VB.
    Ich habe schon auf sehr vielen Seiten im Internet nachgeschaut, aber ich bekomme es einfach nicht in den Kopf was der Unterschied zwischen den beiden ist und wann man was anwendet.

    Wäre deshalb sehr Hilfreich von euch, wenn jmd. mir genau nochmal den Unterschied beschreiben kann und ggf. noch ein par Beispiele nennen kann. Für mich sind irgendwie beide Varianten sehr gleich, zu mindestens hören sie sich gleich in den meisten Definitionen an.

    Ich hoffe mir kann jmd. helfen und bedanke mich schon mal :)
    Die ursprüngliche Grundidee war folgende:
    While nimmt man zur Vorabprüfung

    Visual Basic-Quellcode

    1. Do While <condition>
    2. ...
    3. Loop
    Die Schleife wird schon gar nicht angegangen, wenn die Bedingung nicht True ist.

    Until nimmt man zur Prüfung im Nachgang

    Visual Basic-Quellcode

    1. ​Do Loop
    2. ...
    3. Until <condition>
    Die Schleife läuft mindestens einmal durch, dann wird die Bedingung erst geprüft.

    Soweit zu Historie.

    Jetzt lässt sich das in VB.Net natürlich auch vertauschen.
    Damit reduziert sich die While-Bedingung auf eine Positiv-Prüfung. Die muss zum Schleifen True sein und wird in der Schleife False gesetzt, damit die Abbruchbedingung erreicht wird.
    Und die Until-Bedingung auf eine Negativ-Prüfung. Die ist zunächst False und die Schleife bricht ab, wenn die Bedingung auf True gesetzt wird.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Dann wäre ich mal neugierig, wie das der compiler umsetzt. Normale Do While, Do Until Schleifen, werden mit While-EndWhile umgesetzt.
    Vielleicht wird am Ende der Schleife mit ner If-Abfrage geprüft und die Schleife direkt verlassen.. Ich probiers mal eben.

    MfG Tim

    petaod schrieb:

    Schon IL wird wahrscheinlich so was ähnliches daraus machen.

    IL-Code

    Quellcode

    1. // loop start (head: IL_0008)
    2. IL_0008: ldloc.0
    3. IL_0009: ldc.i4.1
    4. IL_000a: add.ovf
    5. IL_000b: stloc.0
    6. IL_000c: ldloc.1
    7. IL_000d: stloc.3
    8. IL_000e: ldloc.3
    9. IL_000f: brtrue.s IL_0008
    10. // end loop
    11. IL_0011: nop
    12. // loop start (head: IL_0012)
    13. IL_0012: ldloc.0
    14. IL_0013: ldc.i4.1
    15. IL_0014: add.ovf
    16. IL_0015: stloc.0
    17. IL_0016: ldloc.2
    18. IL_0017: ldc.i4.0
    19. IL_0018: ceq
    20. IL_001a: stloc.3
    21. IL_001b: ldloc.3
    22. IL_001c: brtrue.s IL_0012
    23. // end loop

    Die erste ist eine Do Loop While, das zweite eine Do Loop Until. beide inkrementieren einen integer um 1 .
    Die Do Loop Until scheint noch etwas zusätzlich zu prüfen, im gegensatz zur Do Loop While. Dafür bräuchts jetzt jedoch jemanden der sich wirklich mit IL auskennt. Im IL sind die also auch noch nicht gleich.

    EaranMaleasi schrieb:

    Im IL sind die also auch noch nicht gleich
    Sind ja auch zwei unterschiedliche Funktionalitäten.
    Die eine muss bei TRUE abbrechen, die andere bei FALSE.
    Und dafür muss halt das entsprechende Register vorbereitet werden.
    Der Schleifenrücksprung am Ende ist nämlich derselbe bedingte Branch (brtrue.s).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --