Wie prüfen, ob Variable initialisiert wurde?



  • Hallo,

    wie kann ich checken, ob eine Variable initialisiert wurde?

    Beispielsweise gibt

    double x;
    printf("%f", x)
    

    eine betragsmäßig sehr große negative Zahl aus, die nicht per _isnan abgefangen werden kann.

    Gruß, Thomas.



  • das kannst du nicht prüfen, da der wert einer nich initialisierten variable undefiniert ist, alles ist also möglich.



  • Das macht man ja auch nicht. Man deklariert keine Variablen ohne sie zu initialisieren.
    double x = 0; # oder ein anderer Wert
    Sollte man schon machen. Es hilft natürlich auch die Variablen erst dann zu erstellen bevor man sie braucht. Dann ist die Gefahr kleiner das man irgendwo eine hat die unsinnig ist.



  • soweit ich weiß werden in c++ variablen immer automatisch initialisiert. in c++ gibt es also im gegensatz zu c keine uninitialisierten variablen



  • Nur globale Variablen werden automatisch mit ihrem default-Wert (bei elementaren Datentypen ist das 0) initalisiert.



  • FireFlow schrieb:

    Nur globale Variablen werden automatisch mit ihrem default-Wert (bei elementaren Datentypen ist das 0) initalisiert.

    laut c++ standard oder nur bei nem bestimmten os?



  • FireFlow schrieb:

    Nur globale Variablen werden automatisch mit ihrem default-Wert (bei elementaren Datentypen ist das 0) initalisiert.

    aber wenn die lokale variable ein objekt ist, dann wird doch zumindest der default-konstruktor aufgerufen? und objektvariablen werden ja auch immer initialisiert. daß bei objekten initialisiert wird, bei einfachen typen aber nicht, und das auch nur bei lokalen variablen und nicht bei globalen- oder objektvariablen, finde ich irgendwie widersinnig. also ich hab das bisher immer so verstanden, daß alle variablen, global wie lokal, automatisch initialisiert werden.

    PS: wo bekomme ich eigentlich die dokumentation des ansi/iso/(wasauchimmer-draft)-c++ her? ich mache c++ noch nicht so lange.





  • hab mal Cpt.Tangas links durforstet und bin auf folgendes gestoßen:

    2 Variables with automatic storage duration (_basic.stc.auto_) are ini-
    tialized each time their declaration-statement is executed. Variables
    with automatic storage duration declared in the block are destroyed on
    exit from the block (_stmt.jump_).

    wenn ich das richtig verstehe, dann bedeutet das, daß lokale variablen immer initialisiert werden.



  • int a;
    cout << a;
    

    Was kommt da raus?



  • FireFlow schrieb:

    int a;
    cout << a;
    

    Was kommt da raus?

    kann man nich in foraus sagen



  • Konfusius schrieb:

    hab mal Cpt.Tangas links durforstet und bin auf folgendes gestoßen:

    2 Variables with automatic storage duration (_basic.stc.auto_) are ini-
    tialized each time their declaration-statement is executed. Variables
    with automatic storage duration declared in the block are destroyed on
    exit from the block (_stmt.jump_).

    wenn ich das richtig verstehe, dann bedeutet das, daß lokale variablen immer initialisiert werden.

    Lies dir durch was Default-Initialisierung für primitive Typen bedeuted und du wirst feststellen, dass solche als lokale Variablen nicht mit einem festen Wert initialisiert werden.

    FireFlow schrieb:

    int a;
    cout << a;
    

    Was kommt da raus?

    Nasenkobolde. Das Programmstück hat undefiniertes Verhalten. Auf den meisten Platformen wird ein nicht vorhersagbarer Wert herauskommen, der von dem Bitmuster an der Speicherstelle wo a steht abhängig ist. Auf einigen Platformen kann es aber z.B. aber auch zu einer CPU-Exception führen, da dort nicht alle Bitmuster als Integer interpretiert werden dürfen.



  • Ich wollte doch gerade mit meinem Beispiel zeigen dass es undefiniertes Verhalten ist und dass die Variable nicht mit einem bestimmten Wert initilisiert wird...



  • Sowas nennt man Gegenbeweis.
    Und der reicht bekanntlich aus, um die ganze Theorie in den Sand zu setzen 😉

    mfg,
    C++ Junkie


Log in to reply