Warum wird das Element float x mit "0" initialisiert? für die Objekte 'a' und 'b' in main ()? [Duplikat]

8

Könnte jemand angeben, welche Klausel im Standard das folgende in Coliru erhaltene Verhalten für das Snippet unterstützt:

%Vor%

Der Code wird gedruckt:

  

10
  0 & lt; - Sollte nicht unbekannt sein?
  1
  0 & lt; - idem
  10
  0
  1
  0

Bearbeiten:

Dieser Absatz wurde aus der 4. Ausgabe von TCPL, Seite 490, erhalten:

  

Dafür sind die Regeln nicht so sauber, wie wir es gerne hätten. Für statisch   Zugewiesene Objekte (§6.4.2), die Regeln sind genau so, als hätten Sie sie benutzt   {}, so ist der Wert von Alpha {"", "", 0}. Jedoch für lokale Variablen   und Free-Store-Objekte, die Standard-Initialisierung erfolgt nur für   Mitglieder des Klassentyps und Mitglieder des eingebauten Typs bleiben übrig   nicht initialisiert, so ist der Wert von Beta {{"", "", unbekannt}.

Herr. Stroustrup sagt nichts über undefiniertes Verhalten.

    
Wake up Brazil 24.12.2013, 22:22
quelle

4 Antworten

6

0 ist einer der möglichen willkürlichen Werte, die eine nicht initialisierte Variable erhalten kann: Das Programm hat ein undefiniertes Verhalten. Da es eine faire Chance gibt, dass der Speicher bei Null initialisiert wird, ist 0 ein wahrscheinliches Ergebnis: Die IEEE 754-Darstellung für 0 ist zufällig nur Nullen. Es gibt jedoch keine Garantie, dass der Wert 0 ist.

    
Dietmar Kühl 24.12.2013, 22:29
quelle
2

Auf Mat hingewiesen, Lesen einer nicht initialisierten Variable in C ++ in undefiniertem Verhalten, was bedeutet, dass alles passieren kann (und wahrscheinlich auf einem System).

Abhängig von Ihrem Compiler und seiner Build-Konfiguration erhalten Sie einen zufälligen Wert in x. In Ihrem Fall ist es zufällig 0.0, aber es kann ein beliebiger zufälliger Wert sein, abhängig davon, welche Daten passiert sind, um das Stück Speicher zu belegen, in dem x zufällig gelandet ist.

In C ++ wird es allgemein als sehr schlechte Praxis angesehen, Membervariablen im Konstruktor nicht zu initialisieren, besonders wenn Sie nicht garantieren können, dass sie initialisiert werden, bevor sie gelesen werden.

    
Timo Geusch 24.12.2013 22:28
quelle
1

Was genau erwarten Sie von "unbekannt"? 0 ist ein vollkommen angemessener Wert für eine nicht initialisierte Variable mit einem unspezifizierten Wert. Es ist nur Zufall.

Wichtig ist, dass die float nicht initialisiert wurde und in der zitierten Passage spricht BS nicht von undefiniertem Verhalten, weil er sich nicht darauf bezieht die Syntax, nach der Sie fragen, aber stattdessen über die Aggregat-Initialisierung (und ihre Varianten).

    
quelle
0

Es ist schlimmer als ein beliebiger Wert. Selbst wenn angenommen wird, dass Ihr Compiler nur den im Speicher verbliebenen Wert verwendet und danach normal auf die Variable einwirkt, könnten die bereits vorhandenen Bits einen Gleitkommafallenwert darstellen und Ihr Programm beim ersten Zugriff beenden.

Aber es geht sogar darüber hinaus. Da der C ++ - Standard die lvalue- & gt; rvalue-Konvertierung für nicht initialisierte Daten als nicht definiertes Verhalten definiert, ist es dem Compiler durchaus erlaubt, alles für den Code zu verwenden, auch den Code, der nicht mit dieser Variablen verknüpft ist und sogar vor dem ersten Zugriff auf diese Variable (solange sie das unbestimmte Lesen der Variablen beweisen kann, was normalerweise nur innerhalb des gleichen Basisblocks möglich ist).

    
Ben Voigt 25.12.2013 04:08
quelle

Tags und Links