Unterscheidung bei int zwischen 0 und null



  • Hallo,

    ich hab ein ziemlich blödes (einfaches?) Problem:
    ich hab Klassenattribute mit Datentyp int. Jetzt möchte ich sie im Konstruktor mit 0 (sprich null) versehen. Wie kann ich denn dann, wenn ich auf diese Attribute zugreifen will, unterscheiden ob es sich um die numerische 0 oder um 'null' handelt?

    Mir fällt leider keine Lösung ein, bin leider Anfänger in C++. Bedank mich im Voraus für etwaige Antworten. 🙂

    lg



  • es gibt keinen unterschied
    afaik ist "NULL" einfach als 0 definiert. Ich habe, glaube ich, irgendwo gelesen, dass man besser immer grundsätzlich 0 verwenden sollte.

    *reaktionszeit von 4 minuten 5 sekunden, und das um zwei uhr nachts. 😉
    Also, ich behaupte einfach mal, internet foren seien eine völlig neuartige (und vom prinzip her die ultimative) Form der intelligenz! 🤡



  • Jo, dass es mit der Zuweisung als 0 nicht geht, hab ich mir eh schon gedacht. Gib's einen anderen Weg, wie man das überprüfen kann? (Ich tipp auf Zeiger, ist der Ansatz richt?)



  • moment mal. Du kannst da gar nichts überprüfen, denn afaik ist:

    #define NULL 0
    

    da gibt es keinen unterschied. Du kannst einem integer nicht einfach so "gar keinen wert" zuweisen. Ein integer hat immer irgendeinen wert.

    \edit1: hast du mal in java programmiert? 🤡
    \edit2: vergiss die NULL, das ist ein überflüssiger artefakt aus C (steht in "The C++ Programming Language" 3. Auflage Kap. 5.1.1)
    in purem C++ sollte dieses makro gar nicht definiert sein. Aber das ist es trotzdem oft, in irgendwelchen WinAPI headern zum beispiel...



  • \hast du mal in java programmiert? 🤡

    Hähä, wie hast du das wohl bloß erkannt? 😃 Ja, komme aus der Java-Ecke und hab so meine Probleme mit den C++-"Spezialitäten". 😉

    Hab aber schon eine Lösung gefunden, weise meiner Variable einen negativen Wert zu, dann sollte das mit der Überprüfung auch klappen.



  • Auch in Java kannst du einem Basisdatentyp nicht null zuweisen. Eine negative Zahl wirkt sich in dienem Fallgenauso aus wie MAX_INT als sozusagen ungültigen Wert zu definieren. Faktisch ist das aber nur so möglich:

    int var = 100;
    bool var_null = false;
    

    MfG SideWinder



  • wow wow wow... da bleibt aber mehr als die hälfte des wertebereiches von int unbenutzt 😉 aber na jut, wenn nichts mehr übrig bleibt... :p

    sag mal, hat es irgendeinen bestimmten grund, warum hier heute so eine welle von Java-Programmierern gibt? 😉 Bist heute nicht der erste, der mit Java-spezifischen annahmen hier ankommt... 😃

    (ne, ist wahrscheinlich zufall...)

    \edit: @sidewinder: oh, sry, dein beitrag kam da noch dazwischen. Alles was ich geschrieben hab bezieht sich auf den vorletzten beitrag.

    Auch in Java kannst du einem Basisdatentyp nicht null zuweisen.

    Das stimmt also doch?... Hab ich mir auch gedacht, war aber unsicher (Java ist bei mir auch schon bissl her, erinnere mich nicht an jede kleinigkeit)

    Aber SideWinder! Zu deiner bool-lösung 😉
    So verschwendet er ja eigentlich ein ganzes byte, bei der negativ=ungültig lösung wäre es immerhin nur ein bit 🙂



  • Ein Bit + sämtliche Kombinationen aus den anderen 7 Bits.

    MfG SideWinder



  • @SideWinder
    Das mag ja sein, aber mittels Wrapperklassen geht das mit null ganz gut. 🙂

    @Andrey
    Ka, vllt. arbeiten die auch alle an ner Übungsabgabe 😃



  • boost::optional bietet eine fertige Implementierung für genau das, eben eine Variable die zusätzlich den Wert "nicht da" haben kann.



  • SideWinder schrieb:

    Ein Bit + sämtliche Kombinationen aus den anderen 7 Bits.

    = 1 Bit :p



  • Im neuen Standard soll es eine Unterscheidungsmöglichkeit geben. Dort soll es dann das Keyword nullptr geben. Man kann also vergleichen, ob es sich um einen Zeiger, der auf NULL gesetzt ist habndelt, oder ob es z.B. eine Integer Variable mit dem Wert 0 handelt.

    ob man nun 0 oder NULL benutzt, mach wirklich keinen Unterschied, da es sich um das von Andrey erwähnte

    #define NULL 0
    

    handelt. Nachdem der Präprozessor die Quellen in den Fingern hatte, sieht der Compiler eh nur 0.

    Gruß Paddy



  • Naja, es gibt auch Compiler die das mit dem NULL ist 0 nicht so eng sehen und gerne mal Warnung ausgeben wenn NULL als int benutzt wird. Also völlig nutzlos ist NULL dann doch nicht.



  • @Paddy: Na, da kann man ja nur hoffen, dass es nicht zur Einführung solcher Keywords kommt. Ich will ja weiterhin:

    int* ptr = 0; // statt nullptr
    
    // und vor allem:
    
    if(!ptr)
    

    schreiben.

    MfG SideWinder



  • SideWinder schrieb:

    @Paddy: Na, da kann man ja nur hoffen, dass es nicht zur Einführung solcher Keywords kommt. Ich will ja weiterhin:

    int* ptr = 0; // statt nullptr
    
    // und vor allem:
    
    if(!ptr)
    

    schreiben.

    Warum soll ein Keyword das denn verhindern?



  • SideWinder schrieb:

    @Paddy: Na, da kann man ja nur hoffen, dass es nicht zur Einführung solcher Keywords kommt. Ich will ja weiterhin:

    int* ptr = 0; // statt nullptr
    
    // und vor allem:
    
    if(!ptr)
    

    schreiben.

    Habe das hier im Forum schon mehrmals geschrieben, wie das funktionieren wird. Habe auch schon mehrmals Links zu dem Proposal gepostet.

    Wieso man da jetzt wieder das ganze negativ sieht, wenn es endlich das Keyword nullptr geben wird, frage ich mich?

    Aber für dich gerne nochmal: Da C++2009 natürlich abwärtkompatibel ist, ist deine präferierte Schreibweise weiterhin möglich.



  • Wenn:

    int* p = 0;
    // sowieso semantisch äquivalent zu
    int* p = nullptr;
    

    sein wird, da abwärtskompatibel, frage ich mich wo der Sinn der längeren Schreibweise sein soll.

    Edit: Steht aber bestimmt in deinem Proposal, dass ich leider noch nicht gefunden habe.

    MfG SideWinder





  • #include <iostream>
    
    void foo(int *a)
    {
    	std::cout << "pointer" << std::endl;
    }
    
    void foo(int a)
    {
    	std::cout << "int" << std::endl;
    }
    
    int main()
    {
    	foo(0);
    	foo(NULL);
    	foo((int*)0);
    }
    

    Also, ich halte 0 nicht gerade für ne gute Lösung. Wenn ich nicht explizit den Pointercast angebe, wird die int-Funktion und nicht die Pointer-basierte Funktion aufgerufen. Dann kann ich auch gleich nullptr hinschreiben....



  • Hast du da auch ein Beispiel aus der Standardbibliothek, wo ich das einsetzen könnte? Ich benenne in solchen Fällen die Pointer-Funktion ganz einfach um *g*

    MfG SideWinder


Log in to reply