Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erlaubt der Compiler die Selbstinitialisierung von Variablen in C/C?

Warum erlaubt der Compiler die Selbstinitialisierung von Variablen in C/C?

Susan Sarandon
Susan SarandonOriginal
2024-11-16 06:50:03527Durchsuche

Why does the compiler allow self-initialization of variables in C/C  ?

Nicht initialisierte Variablen bei der Selbstinitialisierung: Verhalten und Standards

Im Bereich der Programmierung ist es oft ein Problem, nicht initialisierte Variablen zu verwenden Der Fall, dass eine nicht initialisierte Variable als eigener Initialisierer verwendet wird, ist ein einzigartiges Szenario entsteht.

Bedenken Sie den folgenden Code:

int main(void) {
    int i = i;
}

Überraschenderweise verwendet dieser Code Standards wie C99, C11, C 11 usw. in clang/gcc/clang/. Er kann mit kompiliert werden G. Darüber hinaus gibt der Compiler keine Warnungen aus, wenn Sie die Option -Wall -Wextra angeben.

Wenn Sie jedoch Ihren Code in int i = i 1; ändern und die Option -Wall angeben, erhalten Sie möglicherweise eine Warnung ähnlich der folgenden:

why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
    int i = i + 1;
        ~   ^
1 warning generated.

Warum lässt der Compiler diesen Code zu? Und wie spezifiziert der C/C-Standard dies?

Compiler-Toleranz

Die Variable i ist bei der Selbstinitialisierung nicht initialisiert, sodass sie zu diesem Zeitpunkt einen unspezifischen Wert hat. Ein unspezifischer Wert ist entweder unspezifizierter Wert oder Trap-Ausdruck.

Wenn eine Implementierung Stopfbits für Ganzzahltypen unterstützt und unspezifische Werte Trap-Ausdrücke sind, führt die Verwendung zu undefiniertem Verhalten.

Wenn die Implementierung nicht über das Ganzzahl-Auffüllbit verfügt, ist der Wert einfach nicht spezifiziert und es tritt kein undefiniertes Verhalten auf.

Standardbestimmungen

Abschnitt 6.3.2.1p2 der C11-Standarddetails:

lvalue stellt ein Objekt mit automatischer Speicherdauer dar, das Objekt hätte mit der Registerspeicherklasse deklariert werden können (die Adresse wurde nie genommen) und das Objekt wurde nicht initialisiert (Wenn es nicht in einem Initialisierer deklariert ist und nein Die Zuweisung erfolgt vor der Verwendung), sein Verhalten ist undefiniert.

Wenn Sie also nie die Adresse von i erhalten haben, erhalten Sie undefiniertes Verhalten. Ansonsten gilt die obige Aussage.

Das obige ist der detaillierte Inhalt vonWarum erlaubt der Compiler die Selbstinitialisierung von Variablen in C/C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn