(Warum) ist die Verwendung einer nicht initialisierten Variablen-Undefinierte Verhalten?

Wenn ich:

unsigned int x;
x -= x;

es ist klar, dass x sollte null nach diesem Ausdruck, aber überall sehe ich, Sie sagen die Verhalten dieser code ist undefiniert, nicht bloß der Wert der x (bis vor der Subtraktion).

Zwei Fragen:

  • Ist die Verhalten dieser code in der Tat undefiniert?

    (E. g. Könnte die code-crash [oder schlechter], die auf einem kompatiblen system?)

  • Wenn dem so ist, warum nicht C sagen, dass die Verhalten ist undefiniert, wenn es ist völlig klar, dass x sollte null sein hier?

    also, Was ist die Vorteil gegeben, indem Sie nicht definieren das Verhalten hier?

Klar, der compiler könnte verwenden Sie einfach was Müll Wert, den es als "handy" in der Variablen, und es funktionieren würde, wie gedacht... was ist falsch mit diesem Ansatz?

  • möglich, Duplikat der Warum macht der C-standard lassen Sie die Verwendung von unbestimmten Variablen undefiniert?
  • Was ist der Vorteil gegeben durch die Festlegung eines speziellen Fall für das Verhalten hier? Sicher, können alle unsere Programme und Bibliotheken, die größer und langsamer, da @Mehrdad vermeiden will, die Initialisierung einer variable in einer bestimmten und seltenen Fall.
  • Wenn man sich die Antwort gibt, es ist die Beantwortung eine etwas andere Frage (warum C nicht zu initialisieren-Variablen), nicht, warum das Verhalten nicht definiert.
  • Ich Stimme nicht mit, dass ein dupe. Unabhängig davon, ob der Wert, den es dauert, die OP erwartet, dass es zu null nach x -= x. Die Frage ist, warum der Zugriff auf nicht initialisierte Werte überhaupt ist UB.
  • Es ist interessant, dass die Aussage x=0; ist in der Regel umgewandelt xor x,x in der Montage. Es ist fast das gleiche wie das, was Sie hier zu tun versuchen, aber mit xor statt der Subtraktion.
  • Es gibt auch Was passiert mit einem erklärt, nicht initialisierte variable, die in C -- hat es einen Wert, dessen akzeptierte Antwort auf jeden Fall funktioniert-Adresse UB.
  • 'also, Was ist der Vorteil von nicht definieren das Verhalten hier? - Ich hätte gedacht, dass der Vorteil der standard-Auflistung nicht die Unendlichkeit der Ausdrücke mit Werten, verlassen Sie sich nicht auf eine oder mehrere Variablen eindeutig ist. Zur gleichen Zeit, @Paul, solche eine änderung der Norm nicht machen würde Programme und Bibliotheken, die alle größer.
  • Ähnlich: stackoverflow.com/questions/25074180/...
  • Sie sollten wahrscheinlich link, das andere für das eine, in Anbetracht dieser kam 2 Jahre früher.
  • OK, habe eine Kommentar-link. Beide Fragen haben guten und etablierten Antworten, damit schließen als Duplikat, ist wohl nicht angebracht, obwohl vielleicht ein moderator machen könnte Zusammenführen.
  • Ja, wir können wohl lassen als Sie ist, Sie sind nicht ganz Duplikate, denke ich.
  • So dass unbestimmte Werte seltsam Verhalten erlauben können nützliche Optimierungen. Zum Beispiel, gegeben uint16_t foo(void) {uint16_t result; , gefolgt von verschiedenen Aussagen, von denen jede möglicherweise oder möglicherweise nicht Ergebnis schreiben und dann return result;} es kann hilfreich sein, um den compiler zu halten result in einer 32-bit-register und dann zurückkehren. Wenn alles speichert einen Wert als Ergebnis, der compiler wird dafür sorgen, den gespeicherten Wert 0..65535, aber wenn es nichts schreibt result ist, halten Sie die return-Wert innerhalb dieses Bereichs würde erfordern das hinzufügen einer extra-Anweisung.
  • Einer Ihrer typischen 4 Jahr später nicht sequiturs. Mein Kommentar war speziell auf das "- Ausdrücke mit den Werten, verlassen Sie sich nicht auf eine oder mehrere Variablen" - in diesem Fall x - x. Die Norm waren, um anzugeben, dass uint16_t foo(void) {uint16_t result; result -= result; return result;} gibt 0 zurück, dies würde nicht konforme Programme und Bibliotheken größer. Wir haben keine Angst vor Buggys code produzieren größere binaries. Wir wollen, dass der compiler optimieren zu können konformen Programme nutzen zu undefiniertem Verhalten, und die Spezifikation nicht ändern würde, dass.

InformationsquelleAutor Mehrdad | 2012-08-14
Schreibe einen Kommentar