Wie überprüfe ich, ob eine Variable in C initialisiert wurde?

Lesezeit: 5 Minuten

Benutzeravatar von Hafiz Temuri
Hafiz Temuri

Gibt es eine Möglichkeit zu überprüfen, ob eine Variable in C initialisiert wurde oder nicht?

Betrachten Sie das folgende Beispiel,

int main(){
    int a = 3, b = 7, c;

    if ( a > b )
        c = a-b;

    // Now, how can I check if the variable "c" has some value or not
    // I don't want check like this,
    // if ( isalpha(c) ) or if ( isdigit(c) )
    // or anything similar to like that
}

Mit anderen Worten, hat C eine Funktion wie defined in Perl. Im Perlkann ich einfach tun if (defined c)das würde prüfen, ob die Variable definiert ist oder nicht, und es würde False für das obige Beispiel zurückgeben. Wie kann ich das gleiche in C erreichen?

  • @nullpointer: Das funktioniert nicht; es ist nur undefiniertes Verhalten.

    – Benutzer2357112

    8. April 2016 um 3:28 Uhr

  • @SohanShirodkar: c hat keinen Standardwert. Sein Anfangswert ist nicht spezifiziert. Lesen würde es verursachen undefiniertes Verhalten.

    – Bill Lynch

    8. April 2016 um 3:36 Uhr


  • @BillLynch, wo Sie sagten, “nicht spezifiziert” sollte “unbestimmt” lauten

    – MM

    8. April 2016 um 4:14 Uhr

  • In C würden wir sagen, dass Ihre Variable c ist definiert als ganze Zahl, aber es ist nicht initialisiert Wenn b < a. Wenn eine Variable nicht definiert ist und Sie versuchen, darauf zu verweisen, generiert der Compiler einen Fehler (die Variable existiert nicht). In einigen Fällen warnt Sie der Compiler möglicherweise, wenn Sie auf eine Variable verweisen, bevor Sie ihr einen Wert zugewiesen haben. Aber abgesehen von den Methoden, auf die in der akzeptierten Antwort verwiesen wird, haben Sie keine Laufzeitmethode, um zu überprüfen, ob Sie einen Wert zugewiesen haben.

    – Tomlogik

    8. April 2016 um 5:27 Uhr

  • “definiert” bedeutet, dass der Variablen Speicher zugewiesen wird. Wenn Sie verwenden int c;, c ist beides erklärt und definiert.

    – Spikatrix

    8. April 2016 um 5:38 Uhr

C hat diese Fähigkeit nicht. Sie haben zwei Hauptoptionen:

Ein Sentinel-Wert

Wenn Sie beispielsweise wissen, dass der Wert von c wird niemals negativ sein, dann initialisieren Sie es auf -1und teste das dafür.

Fügen Sie eine weitere Variable hinzu

Erstellen Sie eine weitere Variable bool we_set_c_to_something = false; und dann auf setzen true wenn du anschreibst c.

C ist eine kompilierte Sprache, die keine Laufzeitvariablenbindung unterstützt, während Perl eine interpretierte Sprache ist, die dynamische Typisierung unterstützt. Sie können also die Definition einer Variablen in Perl überprüfen, aber nicht in C.

Wenn Sie eine Variable in C deklarieren int c;diese Variable c ist definiert, aber ohne Initialisierung. Deklaration und Definition befinden sich in einer Anweisung.

Die Definition einer Variablen in C wird nicht vom Codeschreiber überprüft. Die Compiler erledigen das für Sie. Beim Kompilieren und Linken Ihres C-Codes überprüft der Compiler alle Variablendefinitionen. Wenn in Ihrem Code undefinierte Variablen gefunden werden, wird ein Fehler ausgelöst und der Kompilierungs- oder Verknüpfungsprozess wird angehalten.

Ich hoffe, dies wird Sie dazu bringen, die Unterschiede zu erkennen.

  • Teile davon finde ich etwas ungenau. AFAIK dynamisch tippen ist nicht wirklich das, was es erlaubt, auf undefinierte Variablen in Perl zu verweisen, obwohl ich nicht sicher bin, wie der tatsächliche Name der Funktion lautet. Auch wenn Sie sagen, dass ein Compiler/Linker mit einem Fehler fehlschlägt, wenn es undefinierte Variablen gibt, wenn Sie “undefiniert” sagen, meinen Sie vermutlich nicht deklariertnicht nicht initialisiert? (Compiler allgemein nicht Stop für nicht initialisierte Variablen, es sei denn, Sie werden ausdrücklich darum gebeten.)

    – David Z

    8. April 2016 um 8:18 Uhr

  • @ DavidZ Als ich sagte undefined, es ist undefiniert. zB nur eine Aussage extern int a;, kann ich a in meinem C-Code verwenden. Es ist deklariert, aber nicht definiert. Es gibt einen Fehler beim Linken, aber keinen Fehler beim Kompilieren.

    – Alijandro

    8. April 2016 um 8:38 Uhr

  • Ah, ich verstehe was du meinst. Entschuldigung, das habe ich falsch verstanden. Es könnte Dinge klären, die zu erwähnen sind extern in Ihrer Antwort als (oder das) Beispiel dafür, wie eine Variable deklariert, aber nicht definiert werden kann.

    – David Z

    8. April 2016 um 8:47 Uhr


  • Wahrscheinlich dynamische Referenzbindung.

    – Benjamin Grünbaum

    8. April 2016 um 9:40 Uhr

Grahams Benutzeravatar
Graham

Falsche Frage. Sie fragen nicht, ob die Variable ist definiert. Wenn die Variable nicht definiert ist, schlägt die Kompilierung fehl. Schlagen Sie den Unterschied zwischen “Deklaration” und “Definition” nach. Im Fall dieser lokalen Variablen Sie haben definierte die Variable c.

Was Sie suchen, ist Initialisierung. Viele Compiler warnen Sie vor der Verwendung von Variablen, bevor sie initialisiert werden, aber wenn Sie darauf bestehen, diesen Code auszuführen, wird davon ausgegangen, dass Sie es besser wissen als der Compiler. Und an diesem Punkt ist es Ihr Problem. 🙂 Einige Sprachen (z. B. Perl) haben ein zusätzliches Flag, das zusammen mit einer Variablen reist, um zu sagen, ob es initialisiert wurde oder nicht, und sie verbergen vor Ihnen, dass dieses zusätzliche Flag herumhängt, das Sie möglicherweise benötigen oder nicht. Wenn Sie dies in C wollen, müssen Sie es selbst codieren.

Da C++ das Überladen von Operatoren erlaubt, ist es relativ einfach, dies in C++ zu implementieren. Boost bietet eine “Optional“-Vorlage, die es tut, oder Sie könnten Ihre eigene erstellen, wenn Sie eine Programmierübung wünschen. C hat jedoch nicht das Konzept der Operatorüberladung (verdammt, das Konzept existierte nicht wirklich, und die Compiler von heute konnten es wahrscheinlich nicht Ich habe es sowieso nicht unterstützt), also bekommen Sie, was Sie bekommen.

Perl ist ein Sonderfall, weil es die beiden zusammenrollt, aber C nicht. Es ist in C durchaus möglich, Variablen zu haben, die definiert, aber nicht initialisiert sind. Tatsächlich gibt es viele Fälle, in denen wir wollen Das ist der Fall, insbesondere wenn Sie anfangen, Low-Level-Zugriff auf den Speicher für Treiber und ähnliches zu tun.

  • Diese Frage bezieht sich auf C, nicht auf C++.

    – 2501

    8. April 2016 um 9:41 Uhr

  • @2501 Stimmt, aber da die meisten C-Compiler auch C++-Compiler sind, schien es nebenbei erwähnenswert. Viele Leute schreiben C-ähnlichen Code sowieso in C++, weil ihnen einige der zusätzlichen Funktionen gefallen. Es gab mir auch einen Haken, um zu veranschaulichen, warum es nicht zu Standard-C hinzugefügt werden kann.

    – Graham

    8. April 2016 um 12:24 Uhr


1405870cookie-checkWie überprüfe ich, ob eine Variable in C initialisiert wurde?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy