if anweisung



  • Hallo,
    ich lese mir gerade das buch "der programmierer" durch und bin auf ein problem gestoßen.

    undzwar

    #include<iostream>
    using namespace std;
    
    int main()
    {
    int i = 0, j = 2; 
    if(i++ && j++) { // ab dem zeitpunkt müsste doch i = 1 und j = 3 sein
        i++;         // und hier i = 2 und j = 3
    
    }
    cout << i << j;
    
    }
    

    das ergebnis dieses codes ist 1 2 und das verstehe ich nicht.
    es wird von links nach rechts gelesen dh erst wird i++ ausgeführt, wenn das geht wird j++ ausgeführt und wenn beides ging wird nochmal i++, ausgeführt.

    Ich meine das programm müsste 2 3 ausgeben, was es aber nicht tut.

    wenn i = 1 und j = 2 ist wird 3 3 ausgeben, was ich nachvollziehen kann.

    wo liegt mein denkfehler ? 😞



  • Was meinst Du mit "wenn das geht"?



  • damit meine ich wenn beide anweisungen im if schleifenkopf true sind wird die if answeisung i++; ausgeführt oder nicht ?



  • Richtig. Die erste ist aber false.



  • du meinst i++ im schleifenkopf ist false weil i = 0 ist ?

    aber warum wird dann i 1 ? i++ im schleifenkopf wird ja nicht ausgefürt weil es false ist und die if answeisung wird auch nicht ausgeführt weil eine der Bedingungen nicht True ist.

    Ab welchem zeitpunkt wird dann i = 0 zu i = 1 ?



  • kantaki schrieb:

    du meinst i++ im schleifenkopf ist false weil i = 0 ist ?

    Ja. Aber ich sehe hier nirgends eine Schleife.

    kantaki schrieb:

    i++ im schleifenkopf wird ja nicht ausgefürt weil es false ist

    Das geht kausal nicht ganz auf. Wie soll herausgefunden werden, dass i++ als bool interpretiert false ist, wenn der Ausdruck gar nicht erst ausgewertet wird?



  • das if ist true, i wird est inkrementiert und dann geschaut ob !0



  • ah ok danke 🙂



  • Nein es wird erst geschaut ob i!=0 ist und auf jedenfall inkrementiert!!!



  • orioon schrieb:

    das if ist true, i wird est inkrementiert und dann geschaut ob !0

    Versteh ich nicht.

    Was passier ist folgendes:
    Deine condition lautet (i++ && j++) - welche als wahr ausgewertet wird, wenn sowohl i++ als auch j++ wahr sind. Da i und j vom Typ integer sind ist dies der Fall wenn sie ungleich 0 sind. Also wird erstmal i++ ausgewertet - es handelt sich um den postincrement-operator.
    Dieser inkrementiert den Wert, gibt aber den Wert vor der Inkrementation zurück.
    Da i vorher 0 war, wird 0 züruckgegeben - was false entspricht.
    Da nun die condition nicht mehr wahr werden kann, wird j++ nicht ausgewertet und auch das i++ im block-statement nicht mehr.

    Die Variablen haben nun also die Werte i = 1 und j = 2.
    Du siehst - alles ist korrekt.



  • alles klar
    dh wenn ich aus dem i++ ein ++i machn würde , wäre das ergebnis 2 3 oder ?



  • Genau so ist es.



  • orioon schrieb:

    das if ist true, i wird est inkrementiert und dann geschaut ob !0

    Falsch, i++ ist Postinkrement.
    Das if ist false , das i wird ausgewertet und "++ vorgemerkt" makiert. i ist aber 0( false ), die Schleifenbedingung ist also false und am Ende wird i inkrementiert.

    Nexus schrieb:

    kantaki schrieb:

    du meinst i++ im schleifenkopf ist false weil i = 0 ist ?

    Ja. Aber ich sehe hier nirgends eine Schleife.

    kennst du nicht: http://if-schleife.de/

    kantaki schrieb:

    alles klar
    dh wenn ich aus dem i++ ein ++i machn würde , wäre das ergebnis 2 3 oder ?

    Ja



  • kantaki schrieb:

    int i = 0, j = 2; 
    if (i++ && j++) { // ab dem zeitpunkt müsste doch i = 1 und j = 3 sein
        i++;          // und hier i = 2 und j = 3
    
    }
    cout << i << j;
    

    Folgender Code ist äquivalent zu Deinem:

    int i = 0, j = 2;
    int oldi = i;
    ++i;
    if (oldi) {
      int oldj = j;
      ++j;
      if (oldj) {
        ++i;
      }
    }
    

    Warum?
    1. post-fix ++ erhört immer den Wert, den die Variable speichert, liefert aber den alten Wert zurück.
    2. && ist ein kurzschließendes, logisches UND ist. Das heißt, der zweite Operand wird gar nicht erst ausgewertet, falls der erste schon false ist.



  • ups, selber reingefallen 😃



  • danke ihr habt mir sehr geholfen.



  • hi,

    && Operator hat vorrang und i ist zum zeitpunkt false "0"

    probiere es mal mit 1 und 3 oder 4 und 6 usw

    mfg



  • foxviper schrieb:

    && Operator hat vorrang und i ist zum zeitpunkt false "0"

    && ist im Ausdruck i++ && j++ der Operator mit der niedrigsten Priorität. Oder meinst du, er wird vor dem zweiten ++ ausgeführt?



  • foxviper schrieb:

    hi,

    && Operator hat vorrang und i ist zum zeitpunkt false "0"

    probiere es mal mit 1 und 3 oder 4 und 6 usw

    mfg

    && (logisches UND) ist sogut wie ganz unten in der Prioritätenreihenfolge, während die postfix-operatoren ziemlich weit oben sind.

    Siehe: http://www.cppreference.com/wiki//language/operator_precedence?redirect=1

    P.S.: zackzefix - entweder muss ich noch schneller tippen oder keine links raussuchen 😃


Anmelden zum Antworten