Frage

Ich habe diese Frage, über die ich vorhin nachgedacht habe, die aber nicht trivial zu beantworten ist

int x = x + 1;
int main() {
  return x;
}

Meine Frage ist, ob das Verhalten des Programms definiert oder undefiniert ist, wenn es überhaupt gültig ist.Wenn es definiert ist, ist es der Wert von x bekannt in main?

War es hilfreich?

Lösung

Ich bin mir ziemlich sicher, dass es definiert ist und x den Wert 1 haben sollte.§3.6.2/1 sagt:„Objekte mit statischer Speicherdauer (3.7.1) müssen auf Null initialisiert werden (8.5), bevor eine andere Initialisierung stattfindet.“

Danach ist meiner Meinung nach alles ziemlich einfach.

Andere Tipps

Meine Frage ist, ob das Verhalten des Programms definiert oder undefiniert ist, wenn es überhaupt gültig ist.Wenn es definiert ist, ist der Wert von x in main bekannt?

Dieser Code ist definitiv nicht sauber, aber für mich sollte er vorhersehbar funktionieren.

int x fügt die Variable in das Datensegment ein, das beim Programmstart als Null definiert ist.Vor main(), werden statische Initialisierer aufgerufen.Für x das ist der Code x = x + 1. x = 0 + 1 = 1.Somit würde main() 1 zurückgeben.

Der Code würde definitiv auf unvorhersehbare Weise funktionieren, wenn x ist eine lokale Variable, die auf dem Stapel zugewiesen wird.Im Gegensatz zum Datensegment ist es so ziemlich garantiert, dass der Status des Stapels undefinierten Müll enthält.

Die Variable „x“ wird in der .bss-Datei gespeichert, die beim Laden des Programms mit Nullen gefüllt wird.Folglich ist der Wert von „x“ 0, wenn das Programm in den Speicher geladen wird.

Dann wird vor dem Aufruf von main „x = x + 1“ ausgeführt.

Ich weiß nicht, ob es gültig ist oder nicht, aber das Verhalten ist nicht undefiniert.

Vor dem Hauptaufruf muss x auf 0 initialisiert werden, daher muss sein Wert 1 sein. Wenn Sie main eingeben, wird 1 zurückgegeben.Es ist ein definiertes Verhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top