For-Schleife mit "komischen" Argument



  • Ich meine mit Argument diesen Part der For-Schleife "x+= i++"

    Das Argument ist offensichtlich zulässig aber wenig sinnvoll weil kaum einer dieses Argument versteht und daher anwenden kann.

    Jetzt gibt es ja schon 3 Lösungsvarianten, gibt kein Machtwort 🙂

    Grüß Blade



  • drakon schrieb:

    @volkard:
    Bist du sicher, dass es undefiniert ist?

    Nein.
    Ich glaube, daß es definiert ist, weil ja nicht die selbe Variable zwei Seiteneffekte schlucken muß, und es deswegen zu gar keinem Rennen kommt.



  • volkard schrieb:

    Ergebnis ist undefiniert, weil zwei Nebeneffekte in einem Ausdruck ohne Sequenzpubkte dazwischen vorkommen.

    Ja und? Das ist noch nicht ausreichend für undefiniertes Verhalten. Hier wird ja nur ein einziges Mal auf i zugefriffen. i += i++ hätte undefiniertes Verhalten. x += i++ meiner Meinung nach nicht. Genauso wenig wie
    while ((*dst++ = *src++)); zum Beispiel.

    Gruß,
    SP



  • ist doch simpel da kommt folgendes raus:

    lauf 1:
    i = 1
    x = 1

    lauf 2:
    i = 2
    x = 3

    lauf 3:
    i = 3
    x = 6

    lauf 4:
    i = 4
    x = 10

    Ich würde sowas aber nie machen, das wird unübersichtlich und ich weiß jetzt nicht ob er zuerst zuzählt oder i um 1 erhöht ich bin mal davon ausgegangen das i immer vorher erhöht wird



  • Tim06TR schrieb:

    ist doch simpel da kommt folgendes raus:

    lauf 1:
    i = 1
    x = 1

    lauf 2:
    i = 2
    x = 3

    lauf 3:
    i = 3
    x = 6

    lauf 4:
    i = 4
    x = 10

    Gott sei dank ist es simpel!!



  • ???
    <censored>
    Und zweitens hab ich das gefühl, dass das nicht ganz stimmt, denn er sagte 6
    also warsch doch erst x+= statt i++

    EDIT: Zensur 😃 😃 😃


  • Administrator

    David_pb schrieb:

    Gott sei dank ist es simpel!!

    ROFL 😃

    @Tim06TR,
    Ich erbarme mich mal deiner:
    Die Schleife fängt bei i == 0 an und geht bis einschliesslich i == 3 :p

    Grüssli



  • Und ich dachte das wäre eine banale Frage 😃

    Könnte mir nich jemand mal sagen was nun erhöht wird und was wie gesetzt wird.

    Grüße


  • Administrator

    blade1982 schrieb:

    Könnte mir nich jemand mal sagen was nun erhöht wird und was wie gesetzt wird.

    volkard hat es in seinem ersten Beitrag gesagt. Er dachte allerdings, dass es undefiniert sei, was allerdings nicht stimmt. Lies also nochmals den Beitrag von volkard und denk dir das undefiniert weg.

    Grüssli



  • Merke: Der Postfixoperator gibt den nicht inkrementierten Wert zurück.
    Deshalb:
    1. Lauf
    i ist 0
    x ist nach x += i++ gleich 0; da i++ die Variable i um 1 erhöht aber den nicht inkrementierten Wert (in diesem Falle also 0) zurückgibt
    2. Lauf
    i ist 1 (dank Postfixoperator)
    x ist nach x += i++ gleich 1
    3. Lauf
    i ist 2
    x ist nach x += i++ gleich 3 (x = x(1) + i(2) -> obwohl i inkrementiert wurde und damit nun den Wert 3 hat, wird der Wert 2, also der nicht inkrementierte Wert, zurückgegeben)
    4. Lauf
    i ist 3
    x ist nach x += i++ gleich 6 (x = x(3) + i(3))
    anschließend ist i nun 4 wodurch die Abbruchbedingung "i < 4" nicht mehr zutrifft und die for-Schleife verlassen wird.


Anmelden zum Antworten