Ausgabe des Programms

Neue Frage »

Auf diesen Beitrag antworten »
user684 Ausgabe des Programms

Bestimmen Sie die Ausgabe des Programms

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
  
 int x,y,z;
 x += y += z = 1;
 count << 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 << uppervase << i << endl;

i=0xFF00 & ( (1<<11) | (1<<15) ) ; 
cout << hex << uppercase << i << endl;
return 0; 
}


Aufgabe Bestimme die Ausgabe des Programms.

Lösungen*1) x=3; y =2;z=1 *2)x=6; y=2; z=6 *3) 88FF *4) 8800
Ansatz:
1) x=3;y=2; z=1 (z.10)
Wie man für den ersten Code (x+=y+=z = 1 auf => x=3;y=2;z=1 weiß ich)
Alle sind eins und das erste wird mit den zwei Variablen y ; z , das zweite mit z und der dritte behält seinen ursprünglichen Wert

Beim zweiten (z += x<y ? y++ : x++; ), wo die Lösung x=6;2;6 beträgt, denke ich, dass z erst mit x addiert wird und da x nicht kleiner als y addiert x sich um 1 erhöht.

Bei diesen Codes weiß ich nicht wie man an die Lösungen kommt 88FF und 8800:

88FF bezieht sich auf i=0x00FF | ( (1<<11) | (1<<15) ) ;
cout << hex << uppervase << i << endl;



und 8800 auf i=0xFF00 & ( (1<<11) | (1<<15) ) ;
cout << hex << uppercase << i << endl;

Es wäre sehr nett, wenn ihr mir helfen würdet smile
 
Auf diesen Beitrag antworten »
as_string RE: Ausgabe des Programms

Zitat:
Original von user684

Lösungen*1) x=3; y =2;z=1 *2)x=6; y=2; z=6 *3) 88FF *4) 8800

Warum kopierst Du den Quelltext nicht einfach mal in ein Programm-File und kompilierst es selbst. Dann würdest Du merken, dass Du erstens zwei Tippfehler drin hast (beim ersten cout steht count und beim ersten uppercase steht uppervase) und zweitens das Ergebnis so garnicht raus kommt! Und damit meine ich noch nichtmal die genaue Formatierung und so...

Zitat:
Original von user684
Ansatz:
1) x=3;y=2; z=1 (z.10)
Wie man für den ersten Code (x+=y+=z = 1 auf => x=3;y=2;z=1 weiß ich)
Alle sind eins und das erste wird mit den zwei Variablen y ; z , das zweite mit z und der dritte behält seinen ursprünglichen Wert

Nöö, kommt bei mir nicht raus. Das liegt einfach daran: Wie kommst Du auf die Idee, dass alle zuerst 1 wären? Hast Du da noch eine Initialisierung vor dieser Zeile vergessen? Bei mir sind die Werte eher zufällig (bis auf z, das natürlich als einziges initialisiert wird und deshalb 1 ist).
Außerdem gefällt mir Deine Beschreibung nicht so ganz gut: Angenommen, x, y und z wären vor der Anweisung alle auf 1 initialisiert worden. Dann wird zuerst z=1 evaluiert und nimmt selbst den Wert 1 an, dann wird y += 1 evaluiert, vobei diese 1 der Wert ist, zu dem der Ausdruck (z = 1) evaluiert wurde. Also hat der komplette Ausdruck y += (z = 1) als ganzes den Wert 2, weil y vorher 1 war (falls die Initialiserung statt gefunden hätte.) Und dies 2 wird zu guter Letzt zu x addiert, so dass dann in x 3 wäre.
Zitat:
Original von user684
Beim zweiten (z += x<y ? y++ : x++; ), wo die Lösung x=6;2;6 beträgt, denke ich, dass z erst mit x addiert wird und da x nicht kleiner als y addiert x sich um 1 erhöht.

Also, Deine Beschreibung ist vielleicht nicht ganz falsch, aber ich bin mir dennoch nicht so sicher, ob Du das richtig verstanden hast.
Zuerst wird der ternäre Operator mit dem ? und dem : ausgewertet, dazu muss erst der boolsche Ausdruck x<y evaluiert werden, der, wie Du richtig schreibst, false wird. Also nimmt der ganze ternäre Ausdruck den Wert des Ausdrucks hinter dem Doppelpunkt an. Dort steht x++, was zu einem erhöhen von x führt. Allerdings gibt es einen Unterschied zwischen ++x und x++ (Prä- und Post-Inkrement Operatoren). Das erste Fall erhöht erst und der Ausdruck ++x nimmt den Wert nach der Erhöhung an, wohingegen x++ sich vor dem Erhöhen den aktuellen Wert von x merken muss, x dann erhöhen muss und am Ende den zu Beginn gemerkten Wert als Wert für den gesamten Ausdruck zurück gibt.
Z. B., wenn x den Wert 3 hätte, dann würde nach "y=x++;" y den Wert 3 haben (also den Wert von x vor der Erhöhung) und x den Wert 4, wohingegen bei einer Anweisung "y=++x;" y den Wert 4 hätte (also den Wert von x nach der Erhöhung) und x auch den Wert 4.
Dass zu z der Wert von x addiert wird stimmt also an sich schon, nur wenn eigentlich der Wert von x++ addiert und der ist eben der Wert von x vor dem Erhöhen. Trotzdem wird zuerst der Ausdruck x++ evaluiert, bevor der alte Wert von x (die 5) zu z addiert wird.
Angenommen, in der Zeile stünde am Ende ++x, würde nach Ausführung in z der Wert 7 stehen, nicht 6.

Zitat:
Original von user684
Bei diesen Codes weiß ich nicht wie man an die Lösungen kommt 88FF und 8800:

88FF bezieht sich auf i=0x00FF | ( (1<<11) | (1<<15) ) ;

Also, der Ausdruck 1<<11 shiftet die 1 ja um 11 Bit nach links und 1<<15 um 15. Ersteres ergibt die Zahl 0x0800 und letzteres 0x8000, wie Du leicht nachrechnen kannst, wenn Du das eine Zahl im Dualsystem mit einer 1 an der elften Stelle (von hinten quasi) und eine mit der 1 an der 15. Stelle ins Hexadezimalsystem umrechnest.
Beide werden Bit-weise-oder-Verknüpft, so dass im Ergebnis sowohl das elfte als auch das 15. Bit gesetzt ist und so eine 0x8800 raus kommt für den rechten geklammerten Teil.
Diese Zahl wird wiederum mit der 0x00FF Oder-verknüpft. Bei dieser Zahl sind alle ab dem 8. Bit und höher 0 und alle von Bit 0 bis 7 sind 1. Wenn man die Oder-Verknüpfung durchführt, werden dazu dann noch das elfte und das 15. Bit gesetzt und man kommt zum Ergebnis 0x88FF.

Zitat:
Original von user684
und 8800 auf i=0xFF00 & ( (1<<11) | (1<<15) ) ;

Hier ist die hintere Klammer identisch mit der vorhergehenden Aufgabe. Also wird auch hier 0x8800 raus kommen. Diese Zahl wird aber bitweise-Und-Verknüpft mit der 0xFF00, bei der alle höheren Bit, aber keine niedrigeren gesetzt sind. Du kannst ja mal selbst die Und-Verknüpfung durchführen. Weißt Du, was diese ganzen Bit-Operationen überhaupt machen?

Gruß
Marco
Auf diesen Beitrag antworten »
user684 RE: Ausgabe des Programms

Das ist ja das Problem, ich sehe nicht den Unterschied zwischen den Und und Oder Operator..
Könntest du mir den vorzeigen bzw. den entscheidenen veranschlaulichen(z.B. an der Aufgabe)
Auf diesen Beitrag antworten »
as_string RE: Ausgabe des Programms

Kennst Du denn die logischen Und- und Oder-Operatoren? Das Ergebnis einer Und-Verknüpfung ist nur dann wahr, wenn beide Operanden gleichzeitig wahr sind, das Ergebnis einer Oder-Verknüpfung ist wahr, sobald einer der beiden Operanden wahr ist, oder auch wenn beide wahr sind. Wenn beide falsch sind, ist das Ergebnis für beide Verknüpfungen falsch, wenn beide Operanden wahr sind, ist es bei beiden Verknüpfungen wahr, nur wenn der eine Operand wahr und der andere falsch ist, unterscheiden sich die Operatoren. Dann kommt bei "Und" falsch raus und bei "Oder" kommt wahr raus.
Es gibt auch noch ein exklusiv-Oder. Das ist wahr, wenn entweder der eine Operand wahr ist oder der andere, aber im Gegensatz zum normalen Oder ist es falsch, wenn beide Operanden wahr sind.

Die bitwise-Operatoren machen die jeweilige logische Operation mit jedem einzelnen Bit des einen Operanden mit dem korrespondierenden Bit des anderen Operanden.

Falls die prinzipielle Funktionsweise dieser Operatoren das Problem ist: im Internet sind diese sicherlich millionenfach schon erklärt. Suche mal mit Google danach.

Gruß
Marco
 
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »