Ändern der Zählvariable einer for-Schleife im Schleifenrumpf



  • Hallo,

    darf man die Zählvariablen einer for-Schleife im Schleifenrumpf verändern oder darf man das nur innerhalb der runden Klammern zu Beginn der for-Anweisung?
    Ich frag mal, weil es immer so komische Sachen gibt, die bei C++ zu Fehlern führen oder sonstwie nicht gut sind.

    Hintergrund:
    Ich hab mehrfach verschachtelte Schleifen, bei einem bestimmten Wert der Zählvariablen der äußeren Schleife will ich die innere Schleife aber nur einmal durchführen. Ich würde dann die Zählvariable der inneren Schleife auf den "letztmöglichen" Wert setzen.

    Bsp.

    for (int k=0; k<3; k++) {
        for (int m=0; m<3; m++) {
            if (k==0) m=2;
            <Anweisungen>
        }
    }
    

    Oder gibts da was eleganteres? Wenn ich irgendwann später mal den Laufbereich von m ändere, ist die Frage, ob ich da noch weiß, daß ich in der if-Anweisung den Wert von m ebenfalls ändern muß.
    Ich könnte m höchstens nach den <Anweisungen> von vornherein auf einen ganz hohen Wert zu setzen, von dem ich mir einigermaßen sicher bin, daß er auch in späteren Programmversionen nie erreicht werden wird...

    Danke sehr!



  • Du kannst die innere Schleife mit der Anweisung "break" verlassen. Also mach sowas:

    if(k==0) {
      break;
    }
    

    Grundsätzlich darf man die Zählvariablen natürlich schon verändern, aber in dem Fall ist ein break doch deutlich sinnvoller und eleganter.



  • In C++ gibt es sowas wie eine Schleifenvariable gar nicht, eine for-Anweisung ist eigentlich nur eine while-Anweisung mit etwas anderer Syntax. Du kannst die "Schleifenvariable" also beliebig ändern.



  • Wow, ihr seid ja schnell... Danke!
    Hm, dann müßte ich es aber ändern in

    if ((k==0) && (m==1))
    

    da es ja einmal durchgeführt werden soll.
    Wenn ich aber später die untere Grenze ändern würde, paßt es wieder nicht.
    Muß ich wohl doch ne extra Variable einführen, die die Anzahl der Schleifendurchgänge zählt.

    for (int k=0; k<3; k++) {
        for (int m=0, countm=0; m<2; m++) {
            if ((k==0) && (countm>0)) break;
            <Anweisungen>
            countm++;
        } //end for m; 
    } //end for l;
    

    Wäre das jetzt so richtig? Dann wird es für k=0 1x (m=0) und sonst 3x (m=0...2) ausgeführt, oder?



  • susie schrieb:

    Hintergrund:
    Ich hab mehrfach verschachtelte Schleifen, bei einem bestimmten Wert der Zählvariablen der äußeren Schleife will ich die innere Schleife aber nur einmal durchführen. Ich würde dann die Zählvariable der inneren Schleife auf den "letztmöglichen" Wert setzen.

    Wäre es nicht einfacher, wenn die Bedingung der inneren Schleife direkt an die Zählvariable der äusseren Schleife gekoppelt wäre? Also dass die innere Schleife bei einer gewissen Zahl gleich nur einmal durchlaufen wird?



  • Hm, ich wüßte nicht, wie...
    Hab jetzt noch die Überlegung, die <Anweisungen> in einer Funktion zusammenzufassen und vor der inneren Schleife aufzurufen. Ist aus anderen Gründen wieder nicht so schön... Na ja, gibt wohl nix optimales...



  • Das in der inneren Schleife muss ja nicht unbedingt schlecht sein. Ich hätte jetzt nur gedacht, wenn du irgendein bestimmtes Muster hättest (zum Beispiel einmal das erste, zweimal das zweite Element etc. bearbeiten), könntest du sowas machen:

    for (int j = 0; j < 4; ++j)
    {
        for (int i = 0; i < j; ++i)
        {
             ...
        }
    }
    

    Also dass die innere Schleifenbedingung gleich von der äusseren Zählvariable abhängt.

    Edit: Falsche Zählvariable inkrementiert. Dass es bei 0 anfängt, lassen wir mal ausser Acht... 😉



  • Also die untere Grenze ist bei mir meistens auch 0 und somit kannst du mit der Zählvariable auch mitzhählen. Andernfalls brauchst du wirklich eine zusätzliche Zählvariable, was ich aber gar nicht schlimm finde. Würde ich wahrscheinlich auch so machen.


Anmelden zum Antworten