Ausgabe des Programms



  • out schrieb:

    Zu Zeile 7:
    Da gibt es etwas, das nennt sich C++ Operator Precedence. Diese besagt, welche Operanden ein Operator an sich bindet. ➡ Bedeutet sozusagen, dass unsichtbare Klammern gesetzt werden.
    Falls sich gleiche Operatoren gegenüberstehen - wie hier -, wird die Associativity hergenommen: += ➡ Right-to-left
    Daraus ergibt sich also:

    int x=1, y=1, z=1;
    x += (y += z);
    

    Außerdem gibt der += Operator den linken Operanden zurück. Dann steht da sozusagen:

    x += y
    

    Zu Zeile 12:
    Die Reihenfolge, in der die Argumente ausgewertet werden, ist unspezifiziert.
    Ich weiß nicht, ob der Seiteneffekt von x++ eintreten kann, bevor die Bedingung x<y ausgewertet wird. Falls dem so ist, kann die Ausgabe alles Mögliche sein...

    Den Rest überlasse ich den anderen 😃

    Bei Zeile 7 wusste ich ja die Lösung, aber würde gerne wissen, wie man genau bei Zeile 12 etc. würde ich es gerne genau wissen , wie man diese löst..
    Wie kriegt man nun da (Z.12) die Ausgabe raus? Rest sollen ja die anderen mir helfen.



  • out schrieb:

    Zu Zeile 7:
    Da gibt es etwas, das nennt sich C++ Operator Precedence. Diese besagt, welche Operanden ein Operator an sich bindet. ➡ Bedeutet sozusagen, dass unsichtbare Klammern gesetzt werden.
    Falls sich gleiche Operatoren gegenüberstehen - wie hier -, wird die Associativity hergenommen: += ➡ Right-to-left
    Daraus ergibt sich also:

    int x=1, y=1, z=1;
    x += (y += z);
    

    Außerdem gibt der += Operator den linken Operanden zurück. Dann steht da sozusagen:

    x += y
    

    Zu Zeile 12:
    Die Reihenfolge, in der die Argumente ausgewertet werden, ist unspezifiziert.
    Ich weiß nicht, ob der Seiteneffekt von x++ eintreten kann, bevor die Bedingung x<y ausgewertet wird. Falls dem so ist, kann die Ausgabe alles Mögliche sein...

    Den Rest überlasse ich den anderen 😃

    Bei Zeile 7 wusste ich ja die Lösung, aber würde gerne wissen, wie man genau bei Zeile 12 etc. würde ich es gerne genau wissen , wie man diese löst..
    Wie kriegt man nun da (Z.12) die Ausgabe raus? Rest sollen ja die anderen mir helfen.



  • user637 schrieb:

    Und, was die Zeile 17 -19(Bitverschiebung angeht), weiß ich leider nicht weiter bei den Oder Zeichen 11 um 1 nach links oder 15 um 1 nach links

    Es wird ( 1 << 11 ) die 1 um 11 bzw. um 15 Positionen nach links geschoben.



  • Swordfish schrieb:

    user637 schrieb:

    Und, was die Zeile 17 -19(Bitverschiebung angeht), weiß ich leider nicht weiter bei den Oder Zeichen 11 um 1 nach links oder 15 um 1 nach links

    Es wird ( 1 << 11 ) die 1 um 11 bzw. um 15 Positionen nach links geschoben.

    Und was von beiden wird verschoben, bzw berücksichtigt beim | Zeichen?



  • user637 schrieb:

    i=0x00FF | ( (1<<11) | (1<<15) );
    

    Beides wird ausgewertet und die Ergebnisse sind Operanden des bitweisen Oders ( | ).



  • Swordfish schrieb:

    user637 schrieb:

    i=0x00FF | ( (1<<11) | (1<<15) );
    

    Beides wird ausgewertet und die Ergebnisse sind Operanden des bitweisen Oders ( | ).

    Und welches gilt nun, wenn Oder der Operator ist?



  • Die Frage "welches gilt nun" ist sinnfrei. Die würdest Du bei 2 + 4 auch nicht stellen. Warum stellst Du sie dann bei 2 | 4 ?

    1<<11     => 0000100000000000 == 0x0800
        1<<15     => 1000000000000000 == 0x8000
    1<<11 | 1<<15 => 1000100000000000 == 0x8800
    


  • Swordfish schrieb:

    Die Frage "welches gilt nun" ist sinnfrei. Die würdest Du bei 2 + 4 auch nicht stellen. Warum stellst Du sie dann bei 2 | 4 ?

    1<<11     => 0000100000000000 == 0x0800
        1<<15     => 1000000000000000 == 0x8000
    1<<11 | 1<<15 => 1000100000000000 == 0x8800
    

    Weil | Oder bedeutet und bei Und beides gilt.
    Aber auf mich wirkt das gerade wie eine & Verknüpfung, so wie du das verbunden hast..
    Würde bei & was anders rauskommen? Wollte mich übrigens für deinen Rat bedanken.



  • user637 schrieb:

    Swordfish schrieb:

    Die Frage "welches gilt nun" ist sinnfrei. Die würdest Du bei 2 + 4 auch nicht stellen. Warum stellst Du sie dann bei 2 | 4 ?

    1<<11     => 0000100000000000 == 0x0800
        1<<15     => 1000000000000000 == 0x8000
    1<<11 | 1<<15 => 1000100000000000 == 0x8800
    

    Weil | Oder bedeutet und bei Und beides gilt.

    Du hast nichts verstanden... schau dir die Verknüpfungen doch noch mal genauer an, in deinem Buch oder Skript oder was weiß ich



  • Bei "und" käme folgendes raus: 0000000000000000

    Du musst unterscheiden zwischen dem Bitweisen Operatoren & und | und den logischen Operatonen || und && die Wahrheitswerte auswerten.

    Als Beispiel für |:
    101 | 001: von links nach recht -> 1 oder 0: 1, 0 oder 0: 0, 1 oder 1: 1
    = 101

    für &:

    101 & 001: von links nach recht -> 1 und 0: 0, 0 und 0: 0, 1 und 1: 1
    = 001



  • user637 schrieb:

    Swordfish schrieb:

    Die Frage "welches gilt nun" ist sinnfrei. Die würdest Du bei 2 + 4 auch nicht stellen. Warum stellst Du sie dann bei 2 | 4 ?

    1<<11     => 0000100000000000 == 0x0800
        1<<15     => 1000000000000000 == 0x8000
    1<<11 | 1<<15 => 1000100000000000 == 0x8800
    

    Weil | Oder bedeutet und bei Und beides gilt.
    Aber auf mich wirkt das gerade wie eine & Verknüpfung, so wie du das verbunden hast..
    Würde bei & was anders rauskommen? Wollte mich übrigens für deinen Rat bedanken.

    x=5; y=2; z=1; 
       z += x<y ? y++ : x++; 
       cout << x << " " << y << " " << z << endl;
    

    Und wie löst man das?



  • Zerlegen.
    Einfach von links nach rechts lesen:

    x = 5
    y = 2
    z = 1

    1. z wird um irgendwas erhöht, das Irgendwas ist x < y ? y++ : x++;
    2. x < y ist für x=5 und y=2 false, also wird der rechte Teil des ternären Ausdrucks ausgeführt; der linke wird ignoriert
    3. x++ erhöht x um 1 und liefert den alten Wert von x zurück, also 5. x ist danach 6.
    4. z wird also um 5 erhöht

    x = 6
    y = 2
    z = 6


Anmelden zum Antworten