4 Stimmen

printf("%d %d %d \n ",++a, a++,a) Ausgabe

Mögliches Duplikat:
Kann jemand dieses undefinierte Verhalten erklären (i = i++ + ++i , i = i++, etc )

Ich bin nicht in der Lage, die Ausgabe dieses Programms zu verstehen (mit gcc ).

main()
{
  int a=10;
  printf("%d %d %d\n",++a, a++,a);
}

Ausgabe:

12 10 12

Erklären Sie bitte auch die Reihenfolge der Bewertung der Argumente von printf() .

11voto

Carson Myers Punkte 35660

Der Compiler wertet printf Argumente in der Reihenfolge, in der sie sich zu diesem Zeitpunkt befinden. Es könnte eine Optimierungssache sein, aber es gibt keine Garantie: die Reihenfolge, in der sie ausgewertet werden, ist weder durch den Standard noch durch die Implementierung festgelegt. Es gibt keine Möglichkeit, das zu wissen.

Was aber ist ist, dass das zweimalige Ändern derselben Variablen in einer Operation ein undefiniertes Verhalten darstellt; ISO C++03, 5[expr]/4:

Zwischen dem vorherigen und dem nächsten Sequenzpunkt darf der gespeicherte Wert eines Skalarobjekts höchstens einmal durch die Auswertung eines Ausdrucks geändert werden. Außerdem darf auf den vorherigen Wert nur zugegriffen werden, um den zu speichernden Wert zu bestimmen. Die Anforderungen dieses Absatzes müssen für jede zulässige Reihenfolge der Teilausdrücke eines vollständigen Ausdrucks erfüllt sein; andernfalls ist das Verhalten undefiniert.

printf("%d %d %d\n",++a, a++,a); kann auf verschiedene Weise funktionieren: so, wie Sie es erwartet haben, oder auf eine Weise, die Sie nicht verstehen können.

Sie sollten so einen Code nicht schreiben.

6voto

haggai_e Punkte 4504

AFAIK gibt es keine definierte Reihenfolge für die Auswertung der Argumente eines Funktionsaufrufs, und die Ergebnisse können für jeden Compiler unterschiedlich sein. In diesem Fall kann ich davon ausgehen, dass das mittlere Argument zuerst ausgewertet wurde, gefolgt vom ersten und dem dritten.

0voto

Mike Punkte 2527

Wie haggai_e angedeutet hat, werden die Parameter in dieser Reihenfolge ausgewertet: Mitte, links, rechts. Um zu verstehen, warum gerade diese Zahlen angezeigt werden, muss man verstehen, wie das Inkrement funktioniert.

a++ bedeutet "etwas mit a machen und es danach inkrementieren". ++a bedeutet "erst a inkrementieren, dann etwas mit dem neuen Wert tun".

In Ihrem Beispiel wertet printf zuerst a++ aus, liest 10 und druckt es aus und erhöht es erst dann auf 11. printf wertet dann ++a aus, erhöht es zuerst, liest 12 und druckt es aus. Die letzte Variable, die printf auswertet, wird so gelesen, wie sie ist (12), und wird unverändert ausgedruckt.

Obwohl sie in einer zufälligen Reihenfolge ausgewertet werden, werden sie in der Reihenfolge angezeigt, in der Sie sie genannt haben. Deshalb erhalten Sie 12 10 12 und nicht 10 12 12.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X