Zuweisung in einer for Schleife



  • Kann mir jemand folgende Codezeilen erklären

    for (;; lParamSort = Name, bComplementResult = false)
    {
        ...
    }
    

    Habe ich in einem Beispiel auf der Seite von Codeguru entdeckt.
    Was bringen die 2 Zuweisungen in der for Schleife?



  • Das ist scheinbar eine Endlosschleife und nach jedem durchgang wird lParamSort = Name, bComplementResult = false ausgefürht.

    for (;; lParamSort = Name, bComplementResult = false) { /*...*/ }
    // equals
    for (;;) { /*...*/; lParamSort = Name, bComplementResult = false; }
    // equals
    while(true) { /*...*/; lParamSort = Name, bComplementResult = false; }
    


  • Ok nun weiß ich wieso man das so gemacht hat:
    Beim ersten mal wird die Anweisung nicht ausgeführt. Nicht mal der Debuger bleibt an der Stelle stehen. Das heißt die Zuweisung wird erst beim 2ten Durchgang durchgeführt. Jetzt wird in der Schleife über continoue oder break gesteuert.

    So was steht auch in keinem Lehrbuch oder irgendeiner hilfe!



  • y-vonne schrieb:

    So was steht auch in keinem Lehrbuch oder irgendeiner hilfe!

    Jein, indirekt überall: Schau dorch mal nach wie eine for-schleife definiert ist:

    for(A;B;C) {D;}
    D sind die Anweisungen innerhalb der Schleife.

    A wird vor der Schleife ausgeführt. Also gleich A; for(;B;C) {D;}
    ~(Jetzt mal außer Acht gelassen, dass die Varaiblen die dort definiert werden nur innerhalb der Schleife gültig sind (Jetzt mal VC6 außer Acht gelassen))~
    Wenn B false zurückliefert, wird die Schleife beendet. Wenn B "nichts" ist, dann ist es also eine Endlosschleife.
    C wird in jeder Schleife nach D ausgeführt.

    Das heißt die Zuweisung wird erst beim 2ten Durchgang durchgeführt.

    erst ab den zweiten Durchgang.

    Ist halt ein interessantes Konstrukt (was ich bisher nicht gesehen habe) um gotos zu vermeiden:

    goto Loop;
    Loop_Reset:
      lParamSort = Name; bComplementResult = false;
    Loop:
    
      /* ... */
      if(foo == bar)
        goto Loop_Reset;
    
      /* ... */
    
      if(fooBar != 1337)
        goto Loop_End;
    
      goto Loop;
    Loop_End:
    

Anmelden zum Antworten