Unterscheidung bei int zwischen 0 und null



  • 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



  • also bei dieser nullptr geschichte kann ich im moment irgendwie nicht den vorteil erkennen. Imho auch so eine erweiterung wie http://www.c-plusplus.net/whitespace98.pdf

    @OP: nimm ruhig unsigned int und definiere für sich einfach 0xFFFF als den ungültigen wert. das ist 2^32=4.294.967.296 wann wirst du schon so eine riesenzahl gebrauchen können? und dann verlierst du nur eine einzige kombination...



  • SideWinder schrieb:

    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

    #define NULL 0
    int* p1 = 0; // OK
    int* p2 = NULL; // OK
    int* p3 = nullptr; // OK
    
    int i1 = 0; // OK
    int i2 = NULL; // OK (sollte aber nicht OK sein!)
    int i3 = nullptr; // Fehler
    

Anmelden zum Antworten