Unterscheidung bei int zwischen 0 und null



  • 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
    


  • Andrey schrieb:

    @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...

    besser -1 oder (unsigned)-1, das sollte immer alle bits auf 1 setzen, egal wie breit die integers sind.



  • vista schrieb:

    Andrey schrieb:

    @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...

    besser -1 oder (unsigned)-1, das sollte immer alle bits auf 1 setzen, egal wie breit die integers sind.

    Nö. Stichwort: Sign-and-magnitude 🤡



  • @hustbaer: Soll das so eine Art Vorteil sein? Also bis auf Artchis Ersatz bei überladenen Methoden habe ich bisher noch keinen Sinn gesehen. Da solcher Art Funktionen wohl nicht gerade dauernd vorkommen sehe ich eher schwarz, dass sich das durchsetzen wird.

    MfG SideWinder



  • TactX schrieb:

    vista schrieb:

    Andrey schrieb:

    @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...

    besser -1 oder (unsigned)-1, das sollte immer alle bits auf 1 setzen, egal wie breit die integers sind.

    Nö. Stichwort: Sign-and-magnitude 🤡

    wieso nicht? erklär bitte...



  • Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    http://en.wikipedia.org/wiki/Sign_and_magnitude

    MfG SideWinder



  • SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?



  • vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.



  • SideWinder schrieb:

    @hustbaer: Soll das so eine Art Vorteil sein? Also bis auf Artchis Ersatz bei überladenen Methoden habe ich bisher noch keinen Sinn gesehen. Da solcher Art Funktionen wohl nicht gerade dauernd vorkommen sehe ich eher schwarz, dass sich das durchsetzen wird.

    MfG SideWinder

    Klar ist das ein Vorteil. Ein Fehler mehr den der Compiler melden kann ist ein Vorteil !?!
    Ich bin gerade kein besonderer Fan der nullptr Sache, ist mir im Prinzip herzlich egal, wollte nur darauf hinweisen dass es sehrwohl einen Unterschied macht.



  • TactX schrieb:

    vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.

    aber es gibt doch wohl keine CPU mehr, die das so macht.
    wer braucht schon eine negative 0?
    😉



  • @hustbaer: Welchen genauen Fehler erkennt man den damit? Die unabsichtliche Initialisierung eines Integers mit 0 anstatt mit 0?

    MfG SideWinder



  • vista schrieb:

    TactX schrieb:

    vista schrieb:

    SideWinder schrieb:

    Er hat ja schon ein Stichwort geliefert, schlag das doch nach!

    geht es um ausnahmen (falls negative zahlen nicht als 2er-komplement gespeichert werden)?
    oder wie soll ich das verstehen?

    Ja, das meinte ich.

    aber es gibt doch wohl keine CPU mehr, die das so macht.
    wer braucht schon eine negative 0?
    😉

    Würde mich nicht wundern, wenn es den ein oder anderen DSP gäbe der so arbeitet. Hat ja nicht nur Nachteile.



  • Zum Thema nullptr:

    Die Overload Resolution wird dadurch verbessert!

    Wie kann der Compiler denn unterscheiden, ob er die Überladung mit int oder mit int* nehmen soll, wenn man einfach nur 0 übergibt?

    Beispiel:

    void testklasse::test1(int a)
    {
         m_Test = a;
    }
    
    void testklasse::test1(int* pA)
    {
         *pA = m_Test;
    }
    
    ...
    
    testklasse t;
    t.test1(0);       // Will ich jetzt das Attribut m_Test 0 setzen?
    t.test1(NULL);    // wie eine Zeile höher, der Compiler kann nicht zwischen int und int* unterscheiden und wird die int Variante nehmen
    t.test1(nullptr); // Hier ist klar, dass ich die "Get" Methode (mit Pointer) aufrufen möchte.
    

    Das Beispiel ist vieleicht nicht ganz optimal, aber es ist auf jeden Fall sinnvoll eine Unterscheidung zwischen "normalen" und "pointer" Argumenten zu machen. Ich habe es mir in dem Beispiel erspart die int's auch noch anzulegen.

    Gruß Paddy



  • @Paddy82:
    Für die overload resolution kann man im Moment auch static_cast verwenden.



  • @hustbaer

    Wusste ich noch nicht...

    Ist aber trozdem nicht so "schön" wie wenn man das keyword hat, finde ich.



  • Paddy82 schrieb:

    Zum Thema nullptr:

    Die Overload Resolution wird dadurch verbessert!...

    Was ich gut finde ... aber vermutlich wird das "im echten Leben" zu einigem Ärger führen, weil es vielleicht Programme gibt, die das falsch gemacht haben aber das "richtige Verhalten" damit verbinden....("Leichen im Keller").

    Na, mal abwarten - zur Not gibt's einen Compilerschalter, mit dem man das auf das alte Verhalten umschalten kann.

    Gruß,

    Simon2.



  • Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist:

    #ifndef NULL
    #ifdef __cplusplus
    const unsigned long NULL = 0;
    #else
    #define NULL ((void*)0)
    #endif
    


  • Wie die Konstante NULL definiert ist, ist compilerspezifisch.
    Beim MinGW steht z.B.

    #ifndef NULL
        #ifdef __cplusplus
            #define NULL 0
        #else
            #define NULL ((void*)0)
        #endif
    #endif
    

    Und da es sich hier ja um c++ handelt gilt #define NULL 0, was bereits mehrfach erwähnt wurde...



  • midon schrieb:

    Das von euch aber auch keiner auf die Idee gekommen ist mal in der <windef.h> nachzugucken was NULL ist...

    Wo finde ich die denn unter Linux ? 😉

    Gruß,

    Simon2.


Anmelden zum Antworten