Reihenfolge der Bewertung und undefiniertes Verhalten

Wenn ich im Kontext des C ++ 11-Standards spreche (der, wie Sie wissen, kein Konzept für Sequenzpunkte mehr hat), möchte ich verstehen, wie zwei einfachste Beispiele definiert werden.

int i = 0;

i = i++;   // #0

i = ++i;   // #1

Es gibt zwei Themen zu SO, die diese Beispiele im C ++ 11-Kontext erläutern.Hier es wurde gesagt, dass#0 ruft UB und#1 ist gut definiert.Hier es wurde gesagt, dass beide Beispiele undefiniert sind. Diese Mehrdeutigkeit verwirrt mich sehr. Ich habe das gut strukturiert gelesenReferenz schon dreimal aber das thema scheint mir viel zu kompliziert zu sein.

.

Lassen Sie uns das Beispiel analysieren#0: i = i++;.

Entsprechende Zitate sind:

Die Wertberechnung der eingebauten Nachinkrementierungs- und Nachinkrementierungsoperatoren wird vor ihrer Nebenwirkung sequenziert.

Der Nebeneffekt (Änderung des linken Arguments) des eingebauten Zuweisungsoperators und aller eingebauten zusammengesetzten Zuweisungsoperatoren wird nach der Wertberechnung (jedoch nicht nach den Nebeneffekten) sowohl des linken als auch des rechten Arguments sequenziert und wird zuvor sequenziert die Wertberechnung des Zuweisungsausdrucks (d. h. bevor die Referenz auf das geänderte Objekt zurückgegeben wird)

Wenn eine Nebenwirkung auf ein skalares Objekt nicht im Verhältnis zu einer anderen Nebenwirkung auf dasselbe skalare Objekt auftritt, ist das Verhalten undefiniert.

Ich verstehe, dass der Nebeneffekt des Zuweisungsoperators nicht mit den Nebeneffekten der linken und rechten Argumente abgeglichen wird. Somit wird die Nebenwirkung des Zuweisungsoperators nicht mit den Nebenwirkungen von sequenzierti++. So#0 ruft eine UB auf.

.

Lassen Sie uns das Beispiel analysieren#1: i = ++i;.

Entsprechende Zitate sind:

Die Nebenwirkung der eingebauten Vorinkrementierungs- und Vorinkrementierungsoperatoren wird vor ihrer Wertberechnung sequenziert (implizite Regel aufgrund der Definition als zusammengesetzte Zuweisung).

Der Nebeneffekt (Änderung des linken Arguments) des eingebauten Zuweisungsoperators und aller eingebauten zusammengesetzten Zuweisungsoperatoren wird nach der Wertberechnung (jedoch nicht nach den Nebeneffekten) sowohl des linken als auch des rechten Arguments sequenziert und wird zuvor sequenziert die Wertberechnung des Zuweisungsausdrucks (d. h. bevor die Referenz auf das geänderte Objekt zurückgegeben wird)

Wenn eine Nebenwirkung auf ein skalares Objekt nicht im Verhältnis zu einer anderen Nebenwirkung auf dasselbe skalare Objekt auftritt, ist das Verhalten undefiniert.

Ich kann nicht sehen, wie sich dieses Beispiel von dem unterscheidet#0. Dies scheint eine UB für mich aus dem gleichen Grund zu sein wie#0. Die Nebenwirkung der Zuordnung wird nicht mit der Nebenwirkung von sequenziert++i. Es scheint ein UB zu sein. Das oben genannte Thema sagt, dass es gut definiert ist. Warum?

.

Frage: Wie kann ich Regeln anwenden, um die UB der Beispiele zu bestimmen? Eine möglichst einfache Erklärung wäre sehr dankbar. Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage