Warum sind diese Konstrukte mit Hilfe von pre-und post-Inkrement Undefiniertes Verhalten?

#include <stdio.h>

int main(void)
{
   int i = 0;
   i = i++ + ++i;
   printf("%d\n", i); //3

   i = 1;
   i = (i++);
   printf("%d\n", i); //2 Should be 1, no ?

   volatile int u = 0;
   u = u++ + ++u;
   printf("%d\n", u); //1

   u = 1;
   u = (u++);
   printf("%d\n", u); //2 Should also be one, no ?

   register int v = 0;
   v = v++ + ++v;
   printf("%d\n", v); //3 (Should be the same as u ?)

   int w = 0;
   printf("%d %d %d\n", w++, ++w, w); //shouldn't this print 0 2 2

   int x[2] = { 5, 8 }, y = 0;
   x[y] = y ++;
   printf("%d %d\n", x[0], x[1]); //shouldn't this print 0 8? or 5 0?
}
Hausaufgaben? Nicht versuchen, ein Schmerz sein, aber man sollte Sie nie code schreiben, der mit Ausdrücken, wie diese. Sie sind in der Regel als Akademische Beispiele, manchmal zeigt Sie, dass verschiedene Compiler unterschiedliche Ertrags-Ausgang.
NÖ, brauchte nur einige Hinweise auf "sequence points". Während der Arbeit fand ich ein Stück code mit i = i++, I thougth "Dies nicht geändert wird, wird der Wert von i". Getestet habe ich und ich fragte mich, warum. Da habe ich entfernt, diese Aussage und ersetzt es durch i++;
Erklären Sie diese undefinierten Verhalten? Erklären Sie, was über Sie? Wie Sie sich Verhalten ist nicht definiert.
Ich denke, es ist interessant, dass jeder IMMER davon ausgegangen, dass Fragen wie diese sind gefragt, denn der Fragesteller will das Konstrukt in Frage. Meine erste Vermutung war, dass PiX weiß, dass diese schlecht sind, aber neugierig ist, warum das Verhalten so ist, wie die auf whataver compiler-er/Sie war... Und ja, was entspannen Sie sagte... es ist nicht definiert, es könnte nichts tun... einschließlich JCF (Springen und Feuer Fangen)
Ich bin neugierig: Warum nicht den Compiler scheinen zu warnen, auf Konstrukte wie "u = u++ + ++u;" wenn, ist das Ergebnis undefiniert?

InformationsquelleAutor PiX | 2009-06-04

Schreibe einen Kommentar