Ausgabe des Programms



  • Ich wollte fragen, wie man bei dieser Aufgabe löst, bzw. wie man da vorgehen muss.

    Also beim Code z.7-8 kommt ja als Ausgabe x=3; y=2; z= 1 raus , da es sich immer mit dem nächsten summiert.

    Bei z.10- 12 vermute ich, dass da steht, dass z mit x addiert, wird, wenn x kleiner als x ist..?

    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

    Und bei Zeile 21 -22 wird doch durch das Und mit dem Bitmuster addiert.. Bloß da ist ja auch eine Oder Verknüpfung.

    Wäre sehr nett von euch, wenn ihr mir da weiterhelfen könntet.. Bin schon am verzweifeln.

    #include <iostream>
    #include <iomanip>
    
    int main() {
    
       int x,y,z;
       x += y += z;
       cout << x << " " << y << " " << z << endl;
    
       x=5; y=2; z=1;
       z += x<y ? y++ : x++;
       cout << x << " " << y << " " << z << endl; 
    
       unsigned short int i;
       i=0x00FF | ( (1<<11) | (1<<15) );
       cout << hex << uppercase << i << endl;
    
       i=0xFF00 & ( (1<<11) | (1<<15) );
       cout << hex << uppercase << i << endl;
    
       return 0;
    }
    


  • 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 😃



  • 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