Anfängerproblem, bitte Hilfe



  • Hallo liebe Leute,

    Aus einem C++ Anfängerbuch habe ich folgendes Programm entnommen:

    #include <iostream>
    using namespace std;
    
    int main() {
    	char ch1='A';
    	char ch2='B';
    	char ch3='67';
    	char ch4='68';
    
    	cout << ch1 << ch2 << ch3 << ch4 << '\n';
    
    	return 0;
    }
    

    Wie im Buch vorgesehen, kommt die Ausgabe ABCD

    Nun habe ich das Programm auf folgende Art und Weise erweitert:

    #include <iostream>
    using namespace std;
    
    int main() {
    	char ch1='A';
    	char ch2='B';
    	char ch3=66;
    	char ch4=67;
    	char ch5;
    
    	cout << ch1 << ch2 << ch3 << ch4 << '\n';
    	cout << "Bitte geben Sie auch noch Ch5 ein";
    	cin >> ch5;
    	cout <<"Ch5 :" << ch5;
    
    	return 0;
    }
    

    Wenn ich jetzt bspw. 68 eingebe müsste er doch "D" ausgeben, oder?
    Stattdessen gibt er mir "6" aus.Woran könnte das liegen?

    Vielen Dank im Vorraus



  • Hi, so sollte es funktionieren.

    #include <iostream> 
    using namespace std; 
    
    int main() { 
        char ch1='A'; 
        char ch2='B'; 
        char ch3=66; 
        char ch4=67; 
        int ch5; 
    
        cout << ch1 << ch2 << ch3 << ch4 << '\n'; 
        cout << "Bitte geben Sie auch noch Ch5 ein"; 
        cin >> ch5; 
        cout <<"Ch5 :" << static_cast<char>(ch5); 
    
        return 0; 
    }
    


  • Super vielen Danke,

    Kannst du mir vielleicht kurz erklären, warum es an dieser Stelle notwendig ist, "static_cast" zu benutzen?



  • Ich bin jetzt selbst kein Profi, aber ein char kann nur ein Zeichen Speichern. Das cin wird somit auf ein Zeichen gekürzt. Kannst also nur ein Zeichen eingeben. Somit nimmt man einfach ein int und wandelt ihn in einen char um, das macht das static_cast<char>. Gibt aber sicher noch eine elegantere Lösung.


  • Mod

    knallschmand schrieb:

    Super vielen Danke,

    Kannst du mir vielleicht kurz erklären, warum es an dieser Stelle notwendig ist, "static_cast" zu benutzen?

    Die Frage sollte eher lauten, wieso int benutzt werden muss. Hast du gesehen, dass ch5 nun ein int ist?

    Die Antwort ist, dass die Streamoperatoren << und >> "schlau" sind. Sie erkennen den Datentyp und benutzen davon abhängig jeweils andere Formatierungen. Bei dem Programm, das du versucht hast, war ch5 ein char, ein Datentyp für Buchstaben. Beim cin >> ch5 wurde daher versucht, einen Buchstaben auszulesen. Bei der Eingabe von "68" wurde daher der erstbeste Buchstabe, also '6', gelesen.

    Bei dem Programm von tomy86 ist ch5 hingegen ein int, ein Datentyp für Zahlen. Daher wird bei cin >> ch5 eine (Dezimaldarstellung einer) Zahl zu lesen. Das heißt, bei der Eingabe "68" wird tatsächlich der Zahlenwert 68 in ch5 gepackt. Wenn man ch5 nun mittels cout << ch5 ausgeben würde, dann würde ch5 als int erkannt und daher als (Dezimaldarstellung einer) Zahl ausgegeben, also wieder "68", nicht 'D'. Wenn man der Ausgabefunktion jedoch das ch5 als ein char vormacht, dann wird der Wert 68 stattdessen als ein Buchstabe ausgegeben, also als 'D'. Das ist es, was das static_cast macht, man lässt damit einen Datentyp wie einen anderen aussehen.



  • Hi vielen Dank für die Super Erklärung, man sieht ich bin noch nicht allzu lange dabei.

    Meine Frage: Könnte man die Umwandlung des Datentypes auch erst bei "cin" vornehmen, also dass "cin" weiß, dass es jetzt eine int Variable einlesen solll, z.B. so:

    cin >> static_cast<int>(ch5);
    


  • knallschmand schrieb:

    Meine Frage: Könnte man die Umwandlung des Datentypes auch erst bei "cin" vornehmen, also dass "cin" weiß, dass es jetzt eine int Variable einlesen solll, z.B. so:

    Damit der operator>> den Wert der Variable verändern kann, nimmt er eine Referenz auf die Variable*. Mit static_cast<int> wird das allerdings ein temporärer int erstellt, der denselben Wert wie der char hat.
    Und man kann keine Referenzen auf temporäre Werte erstellen, da dieser beim Semikolon zerstört werden und man somit keinerlei Auswirkungen sehen würde.
    Man müsste die Variable also zu einer Referenz auf int casten. Das verletzt allerdings die sog. strict aliasing rule und ist somit verboten.

    *Stichwort: call by reference, falls du es nicht kennst, anstatt einer Kopie kann man das Orginal verändern.


Log in to reply