L-Wert-zu-R-Wert-Konvertierung und undefiniertes Verhalten in int x = x;
In C die Frage, ob ein nicht initialisierter Wert zugewiesen wird sich selbst undefiniertes Verhalten darstellt, war Gegenstand von Debatten. Der Standard (3.3.2) erklärt, dass die Initialisierung einer Variablen mit sich selbst, wie im Beispiel int x = x;, zu unerwarteten Ergebnissen führen kann.
Der Kern des Problems liegt in der potenziellen Anforderung für lvalue- Wert-Umwandlung in solchen Zuordnungen. Angenommen, das rechte x ist eine nicht initialisierte automatische Variable mit einem unbestimmten Wert. Gemäß dem Standard (4.1) führt die Durchführung einer L-Wert-in-R-Wert-Konvertierung für einen solchen Wert zu undefiniertem Verhalten.
Beweis für die L-Wert-in-R-Wert-Konvertierung
Obwohl der Standard keine expliziten Anforderungen enthält, deuten verschiedene Implikationen darauf hin, dass die primäre Absicht darin besteht, dass integrierte Operatoren standardmäßig Werte erwarten. Der Standard weist beispielsweise darauf hin, dass integrierte Zuweisungsoperatoren eine L-Wert-in-R-Wert-Konvertierung für den richtigen Operanden erfordern. Andere Bestimmungen weisen auch darauf hin, dass die Konvertierung von L-Werten in R-Werte im Allgemeinen erwartet wird, sofern nicht ausdrücklich anders angegeben.
Ausweitung der Vermutung auf Initialisierer
Während sich die Initialisierung von der Zuweisung unterscheidet, Die Unklarheit des Standards hinsichtlich der Wertkategorien könnte sich möglicherweise auch auf diesen Bereich erstrecken. Es gibt Hinweise darauf, dass die beabsichtigte Spezifikation darin besteht, Werte überall dort zu erwarten, wo ein Wert benötigt wird.
Konsequenzen für int x = x;
Unter der Annahme, dass die Vermutung wahr ist, wird x mit initialisiert selbst würde eine L-Wert-in-R-Wert-Konvertierung für einen nicht initialisierten Wert erfordern, was zu undefiniert führen würde Verhalten.
Unterstützende Beweise
Weitere Beweise ergeben sich aus der Betrachtung von Code, der nicht initialisierten Variablen unterschiedliche Typen und unterschiedliche Zuweisungen zuweist. Inkonsistentes Verhalten, wie das Verhindern der L-Wert-zu-R-Wert-Konvertierung bei der Referenzinitialisierung, aber das Zulassen bei der Objektinitialisierung, verleiht der Ansicht Glaubwürdigkeit, dass die L-Wert-zu-R-Wert-Konvertierung für die Kopierinitialisierung erwartet wird.
Darüber hinaus a Der Fehlerbericht zielt darauf ab, eine explizite Sprache einzuführen, die Objektwerte im Kontext undefinierten Verhaltens von „nicht initialisiert“ zu „unbestimmter Wert“ neu definiert L-Wert-zu-R-Wert-Konvertierung. Dies deutet auf die Absicht hin, undefiniertes Verhalten in Fällen wie int x = x; zu etablieren.
Schlussfolgerung
Auf der Grundlage der vorgelegten Beweise kann man vernünftigerweise den Schluss ziehen, dass bei der Initialisierung int x = x; eine L-Wert-zu-R-Wert-Konvertierung erforderlich ist. Dies wiederum führt aufgrund der nicht initialisierten Natur des rechten x zu undefiniertem Verhalten. Die Inkonsistenzen und der Klärungsbedarf der Norm unterstreichen die Bedeutung detaillierter Spezifikationen für Wertekategorien.
Das obige ist der detaillierte Inhalt vonIst „int x = x;' ein undefiniertes Verhalten aufgrund der L-Wert-zu-R-Wert-Konvertierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!