NULL und 0



  • Hallo,

    Ich möchte das Thema (diskutiert in diesem Beitrag) nochmal aufgreifen, weil mir immer noch nicht ganz klar ist, warum man NULL bevorzügen sollte. In diesem zusammenhang bin ich auf verschiedene Meinungen gestoßen. Manch einer behauptet das wär eine Geschmackssache, häufig stellen Leute keinen wesentlichen Unterschied fest, manche sagen man soll lieber 0 nehmen, manche NULL. Eins gibt mir aber zum Nachdenken. Wenn Makros direkt aus der Hölle kommen (was ich verstehen kann), warum wird dann NULL (auch von erfahrenen Programierern, die sich der Nachteile bewusst sind) so häufig verwendet?
    In Stroustrup's "The C++ Programming Language" wird auch gegen NULL argumentiert. Wie ist es nun richtig?

    Grüße,
    Rewind


  • Mod

    Eigentlich ist die gängige Lehrmeinung eher die 0. Wir hatten hier vor ein paar Wochen einen langen Thread in dem das schon ausführlich diskutiert wurde. Leider finde ich ihn gerade nicht 😡 . Kann mir jemand weiterhelfen?

    In C++0x (d.h. dem neuen Standard der voraussichtlich dieses Jahr erscheint) wird es auch einen speziellen Nullzeiger geben, der die Diskussion ein für alle Mal beenden sollte.



  • Das ist 10 Jahre alt der Beitrag... Aktuell ist 0 in Mode und NULL kommt aus der Hölle wie du schon erkannt hast :p

    Jedenfalls gibt es in C++0x dann nullptr welchen mann dann zweifellos NULL vorziehen sollte.



  • nullptr hab ich lange erwartet und nutze ihn jetzt auch nur noch, trotz fehlender abwärtskompatiblität...

    sieht einfach verdammt cool aus



  • Wird also NULL vom Präprozessor behandelt? Ich habe nämlich bis jetzt immer NULL verwendet. Sollte dann nämlich wohl auf 0 oder den neuen Standard umsteigen.



  • Hab ihn: http://www.c-plusplus.net/forum/282374?highlight=null

    Der neuste Stand nach 0x ist eh nullptr mit Typsicherheit und so. 🙂



  • Skym0sh0 schrieb:

    nullptr hab ich lange erwartet und nutze ihn jetzt auch nur noch, trotz fehlender abwärtskompatiblität...

    sieht einfach verdammt cool aus

    #define nullptr 0
    

    Löst das Problem in 99% der Fälle.


  • Mod

    Eisflamme schrieb:

    Hab ihn: http://www.c-plusplus.net/forum/282374?highlight=null

    Super, danke dir. Wobei ich besagten Thread irgendwie inhaltsamer in Erinnerung hatte 😞 .



  • Ethon_ schrieb:

    #define nullptr 0
    

    Löst das Problem in 99% der Fälle.

    Ich dachte, nullptr sei nur für diese 1% gedacht. Ihn ständig zu schreiben ist umständlich und hässlich, ich bleib lieber bei meiner schlichten 0.

    Und wenn schon, dann nimmt man das nullptr -Template von Meyers, kein define.



  • SeppJ schrieb:

    Eisflamme schrieb:

    Hab ihn: http://www.c-plusplus.net/forum/282374?highlight=null

    Super, danke dir. Wobei ich besagten Thread irgendwie inhaltsamer in Erinnerung hatte 😞 .

    Hm, ja, ich auch. Hätte zumindest gedacht, dass da noch ein Verweis auf nen anderen Thread ist. Na was soll's, zumindest einige Infos findet man da. 🙂



  • Ich habe auch eine Frage zum nullptr. Macht es einen Unterschied ob ich

    Object* object = new Object();
    ...
    if (object != nullptr) {...}
    

    oder

    if (object) {...}
    

    schreibe? Ich benutze die erste Variante würde mir aber die zusätzliche Schreibarbeit auch sparen wenn beides vom Compiler gleich behandelt wird.



  • Ein normales new gibt nie 0 zurück, es wirft eine Exception. Aber ja, in diesem Fall ist es gleichwertig.



  • mit der zeile

    if (object != nullptr) {...}
    

    meint er glaub ich schon woanders. z.b. in anderen Methoden

    ich schreib auch immer so

    if (object) {...}
    


  • Student83 schrieb:

    Ich habe auch eine Frage zum nullptr. Macht es einen Unterschied ob ich

    Object object = new Object();
    if (object != nullptr) {...}
    

    oder

    if (object) {...}
    

    schreibe? Ich benutze die erste Variante würde mir aber die zusätzliche Schreibarbeit auch sparen wenn beides vom Compiler gleich behandelt wird.

    Ohne Gewähr: Da dem Standardisierungskomitee sehr daran gelegen ist, die Bedeutung von vorhandemem Code nicht zu verändern, wird bei if (object) das Objekt object in einen bool umgewandelt, sodass letztlich nur geprüft wird, ob object auf 0 zeigt. Das ist semantisch nicht dasselbe wie eine Prüfung auf nullptr.



  • Michael E. schrieb:

    Ohne Gewähr: Da dem Standardisierungskomitee sehr daran gelegen ist, die Bedeutung von vorhandemem Code nicht zu verändern, wird bei if (object) das Objekt object in einen bool umgewandelt, sodass letztlich nur geprüft wird, ob object auf 0 zeigt. Das ist semantisch nicht dasselbe wie eine Prüfung auf nullptr.

    Ohne Gewähr: Ich dachte, primitive Typen haben keine operator bool und werden direkt auf 0 überprüft. Ein != nullptr wäre dann semantisch genauso unsinnig wie ein != false bzw. ein == true . Letztendlich ist es in meinem Verständnis das selbe ...



  • gewehr schrieb:

    Ohne Gewähr: Ich dachte, primitive Typen haben keine operator bool

    int main()
    {
    	static_cast<bool>(42);
    }
    

    und werden direkt auf 0 überprüft.

    Ich hab aber nirgends eine 0 geschrieben.

    Ein != nullptr wäre dann semantisch genauso unsinnig wie ein != false bzw. ein == true .

    Ergibt alles Sinn.

    Letztendlich ist es in meinem Verständnis das selbe ...

    nullptr tut mehr als zu prüfen, ob der Zeiger auf 0 zeigt.



  • Student83 schrieb:

    Ich habe auch eine Frage zum nullptr. Macht es einen Unterschied ob ich

    Object object = new Object();
    

    Das ist kein C++. Nehmen wir an, 'object' sei ein roher Zeiger...

    Student83 schrieb:

    if (object != nullptr) {...}
    

    oder

    if (object) {...}
    

    schreibe?

    Das macht keinen Unterschied.



  • Michael E. schrieb:

    Ohne Gewähr: Da dem Standardisierungskomitee sehr daran gelegen ist, die Bedeutung von vorhandemem Code nicht zu verändern, wird bei if (object) das Objekt object in einen bool umgewandelt, sodass letztlich nur geprüft wird, ob object auf 0 zeigt. Das ist semantisch nicht dasselbe wie eine Prüfung auf nullptr.

    So habe ich mir das auch vorgestellt.

    krümelkacker schrieb:

    Das ist kein C++. Nehmen wir an, 'object' sei ein roher Zeiger...

    Deine Annahme ist richtig, war schon spät und ich hab das * vergessen.

    krümelkacker schrieb:

    Das macht keinen Unterschied.

    Alles klar, hätte ich nicht gedacht.



  • krümelkacker schrieb:

    Student83 schrieb:

    Ich habe auch eine Frage zum nullptr. Macht es einen Unterschied ob ich

    Object object = new Object();
    

    Das ist kein C++.

    class Object
    {
        public:
        Object();
        Object(Object *parent);
    };
    

    😃



  • wxSkip schrieb:

    krümelkacker schrieb:

    Student83 schrieb:

    Ich habe auch eine Frage zum nullptr. Macht es einen Unterschied ob ich

    Object object = new Object();
    

    Das ist kein C++.

    class Object
    {
        public:
        Object();
        Object(Object *parent);
    };
    

    😃

    Seine Aussage, das es kein C++ sei, ist vollkommen korrekt. Das kann man vielleicht in C# oder Java so schreiben.

    In C++ muss man dafür ein Zeiger haben und die () sind bei leerer Parameterliste auch nicht korrekt.

    Object *obj = new Object;
    



Anmelden zum Antworten