Frage

Warum druckt das folgende C -Code -Code -Stück? 12 12 12

int main(int argc, char const *argv[]) {
  int a = 2, *f1, *f2;
  f1 = f2 = &a;
  *f2 += *f2 += a += 2.5;
  printf("%i %i %i\n", a, *f1, *f2);
  return 0;
}
War es hilfreich?

Lösung

*f2 += *f2 += a += 2.5;

Diese Linie hat Undefiniertes Verhalten Weil Sie den Wert von ändern *f2(dh a) Mehr als einmal innerhalb des gleichen Ausdrucks ohne intervenierende Sequenzpunkt. UB bedeutet, dass Ihr Programm "Hallo Welt" drucken kann, es kann zum Absturz gebracht werden, es kann drucken 12 12 12 oder 12 12 1029 Oder es kann anfangen, dein Gehirn zu essen. Verlassen Sie sich nicht auf undefiniertes Verhalten.

Um den C ++ - Standard zu zitieren (ich weiß, dass die Frage mit C mit dem Tag versehen ist, aber ich habe keinen C -Standard von mir und ich weiß, dass die gleiche Regel in C gilt)

Sofern nicht angegeben, die Reihenfolge der Bewertung der Operanden einzelner Operatoren und Unterexpressionen einzelner Ausdrücke und der Reihenfolge, in der Nebenwirkungen stattfinden höchstens einmal durch Bewertung eines Ausdrucks. Darüber hinaus muss der vorherige Wert nur zugegriffen werden, um den zu gespeicherten Wert zu bestimmen. Die Anforderungen dieses Absatzes sind für jede zulässige Bestellung der Subtimpressionen eines vollständigen Ausdrucks erfüllt. Ansonsten ist das Verhalten nicht definiert.

Andere Tipps

Es druckt den gleichen Wert für alle aus, weil Sie nur auf einen zeigen int Variable: a.

Es druckt aus 12 Weil a + 2.5 = 4 (a ist ein int), und dann fügen Sie es zweimal zu sich hinzu.


@Downvoters: Warum so negativ? Ich denke, meine Antwort sagt was aus Dieser Compiler macht weiter Dieser Beispielcode, was dem OP helfen sollte, das Verhalten zu verstehen. I stimme zu Armen TsirunyanDie Antwort ist richtig (dh sollte die Zecke bekommen) und das die Das Verhalten ist nicht definiert nach dem Standard. Aber Standards werden implementiert, und ich habe noch keinen Compiler gesehen, der Code kompilt und dann zur Laufzeit plötzlich seine Hände hoch wirft und sagt Undefined behaviour!.

Ich weil *f2 und *f1 zeigen auf a (eine Ganzzahl).

So *f2 = &a = 2 und *f1 = &a = 2

Zu diesem Zeitpunkt fügen Sie dem Wert von hinzu 2.5 (Weil a ist eine Ganzzahl, Sie erhalten 4).

Als du hast

a = 4
f2 = 4
f1 = 4

An diesem Punkt tun Sie f2+f1+a = 12.

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