Warum geht das nicht?



  • Hallo,

    ich möchte folgendes tun:

    Verschiebe den Wert von X um 8 Stellen nach links und fügen den Wert von Y hinzu.

    Ich hab gedacht das geht so:

    (x << 8 | y)

    Doch irgendwie gibt er mir immer nur 0 zurück, das heißt, es wird nichts verschoben, wie verschiebe ich denn jetzt die bits und füge den inhalt von y ran (der ist genau 8 bit groß)

    Hier das beispiel:

    int main()
    {
    long x, y;
    cout<<"Bitte den Wert von X eingeben"<<endl;
    cin>>x;
    cout<<"Bitte den Wert von Y eingeben"<<endl;
    cin>>y;
    x << 8 | y;
    cout<<"X ist dann: "<<x<<endl;
    }



  • Wie wärs mit x = x << 8 | y ?
    x + 1; erhöht x ja auch nicht um eins 😉



  • In Zukunft bitte [cpp]-Tags und aussagekräftige Titel verwenden.



  • Sebastian848 schrieb:

    cin>>x;

    und das muss auch cin>>=x heissen, sonst wird cin auch nicht verändert. 🙂



  • C fan schrieb:

    Sebastian848 schrieb:

    cin>>x;

    und das muss auch cin>>=x heissen, sonst wird cin auch nicht verändert. 🙂

    Nicht ganz...
    Das sind überladene Operatoren, die ihre ursprünglichen semantischen Eigenheiten abgelegt haben...:D



  • Don06 schrieb:

    Das sind überladene Operatoren, die ihre ursprünglichen semantischen Eigenheiten abgelegt haben.

    was faselst du da? 😕 😕 😕



  • C Fan schrieb:

    Don06 schrieb:

    Das sind überladene Operatoren, die ihre ursprünglichen semantischen Eigenheiten abgelegt haben.

    was faselst du da? 😕 😕 😕

    Der Code von Sebastian ist C++. In C++ kann man Operatoren andere Bedeutungen zuweisen. So verändert der >>-operator angewendet auf cin tatsächlch das cin Objekt, obwohl der Operator angewandt auf ein int oder ähnliches das Objekt nicht verändert.



  • Ja und in Gottes Namen verschiebe ich jetzt auch ins C++ Forum, auf dass die peinliche Debatte um vermeintliche shifts bei cin/cout dort beendet ist 🙄



  • Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Don06 schrieb:

    C Fan schrieb:

    Don06 schrieb:

    Das sind überladene Operatoren, die ihre ursprünglichen semantischen Eigenheiten abgelegt haben.

    was faselst du da? 😕 😕 😕

    Der Code von Sebastian ist C++. In C++ kann man Operatoren andere Bedeutungen zuweisen. So verändert der >>-operator angewendet auf cin tatsächlch das cin Objekt, obwohl der Operator angewandt auf ein int oder ähnliches das Objekt nicht verändert.

    dann tut es mir leid. unter überladenen operatoren kann ich mir nichts vorstellen. ich dachte es wäre C und nicht C++



  • @c-fan:

    Gesetzt den Fall, du hast eine Struktur, welche eine Komplexe Zahl darstellt

    struct Complex
    {
        double real;
        double imaginary;
    }
    // Dies sollte auch äquivalent zu C sein.
    

    so würdest du in C eine Addition in der Form vornehmen, dass du eine Funktion schreibst, die entweder ein neues Objekt zurück gibt oder ein bestehendens verändert:

    void add(Complex* c1, const Complex* c2)
        { /* Hier code zum Addieren beider Zahlen und Zuweisung an c1 */ }
    
    // oder
    
    Complex add(const Complex* c1, const Complex* c2)
       { /* Das selbe eben mit Rückgabe eines neuen Complex-Objektes. */ }
    

    Verwenden würdest du das entsprechend:

    Complex c1;
    Complex c2;
    Compley result;
    
    c1.real = 12.0f;
    c1.imaginary = -5.5;
    
    c2.real = 13.50f;
    c2.imaginary = 0.0f;
    
    add(&c1, &c2);
    // oder
    result = add(&c1, &c2);
    

    Mit C++ hast du nun die Möglichkeit, Operatoren zu überladen. Das ganze Funktioniert mit Referenzen (funktionien in den meisten Fällen ähnlich wie Zeiger, sind aber "lediglich" Alias-Namen):

    Complex operator+(const Complex& c1, const Complex& c2)
        { /* Code zum Addieren beider komplexer Zahlen. Hierbei wird ein neues
            Complex-Objekt erzeugt und zurückgegeben. */ }
    

    Verwenden kann man das dann entsprechend, wie man es auch mit nativen Datentypen gewohnt ist:

    result = c1 + c2;
    

    Man kann bei der Operatorüberladung streng genommen beliebige Aktionen durchführen lassen. Es macht nur wenig Sinn bei einer Zuweisung ein "Hallo Welt" auszugeben (was dennoch möglich ist).

    - So, schluss mit der Missionierung 😉 -

    Grüße...

    Heiko



  • @ bwbg

    Also bitte, in C würde man dafür _Complex verwenden 🤡 *scnr*


Anmelden zum Antworten