Heim >Backend-Entwicklung >C++ >Ist „int x = x;' ein undefiniertes Verhalten in C aufgrund der L-Wert-in-R-Wert-Konvertierung?
Initialisierung und L-Wert-zu-R-Wert-Konvertierung
Der bereitgestellte Codeausschnitt wirft ein häufig diskutiertes Problem in C auf. Das Initialisieren einer Variablen mit sich selbst, wie in int x = x;, beinhaltet eine L-Wert-in-R-Wert-Konvertierung. Es stellt sich die Frage, ob diese Konvertierung zu undefiniertem Verhalten (UB) führt, wenn man bedenkt, dass das rechte „x“ ein nicht initialisierter Wert ist und die Konvertierung von L-Werten in R-Werte bei nicht initialisierten Werten generell verboten ist.
Nachweis der erwarteten L-Wert-zu-R-Wert-Konvertierung
Während dem C 11-Standard eine explizite Spezifikation bezüglich der Wertkategorien fehlt Wie von Sprachkonstrukten erwartet, deuten Indizienbeweise darauf hin, dass R-Werte die Standarderwartung sein sollen.
Konvertierung von Anwendung in Initialisierer
In Analogie zum Verhalten integrierter Operatoren ist es vernünftig anzunehmen, dass die Kopierinitialisierung auch eine erwartet prvalue als Initialisierer. Diese Annahme wird durch Folgendes weiter gestützt:
Implikationen für das Code-Snippet
Unter der Annahme, dass die Kopierinitialisierung einen Wert erwartet, ist das Code-Snippet int x = x; würde tatsächlich zu UB führen. Dies liegt daran, dass das rechte „x“ ein nicht initialisierter L-Wert ist und seine Konvertierung von L-Wert zu R-Wert zu einem unbestimmten Wert führen würde.
Weitere Beweise
Ein vorgeschlagener Fehlerbericht unterstreicht die Notwendigkeit, klarzustellen, dass die Konvertierung von L-Werten in R-Werte bei Objekten mit einem unbestimmten Wert UB verursacht. Diese vorgeschlagene Änderung unterstützt weiter die Vorstellung, dass die Kopierinitialisierung solche Konvertierungen nicht zulassen sollte.
Schlussfolgerung
Basierend auf den verfügbaren Beweisen ist es höchstwahrscheinlich, dass int x = X; stellt UB in C dar, da die L-Wert-zu-R-Wert-Konvertierung auf dem nicht initialisierten 'x' verboten ist. Es ist jedoch wichtig zu beachten, dass dem Standard eine endgültige Spezifikation der erwarteten Wertkategorien fehlt, was Raum für weitere Debatten lässt.
Das obige ist der detaillierte Inhalt vonIst „int x = x;' ein undefiniertes Verhalten in C aufgrund der L-Wert-in-R-Wert-Konvertierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!