Undefiniertes Verhalten und Sequenzpunkte erneut aufgegriffen
In dieser Fortsetzung des Themas „Undefiniertes Verhalten und Sequenzpunkte“ befassen wir uns mit dem Verhalten von Ausdrücke mit benutzerdefinierten Typen.
Benutzerdefiniert Typen und undefiniertes Verhalten
Betrachten Sie den folgenden Ausdruck mit einem benutzerdefinierten Typindex:
i += ++i;
Das Verhalten dieses Ausdrucks mit integrierten Typen ist undefiniert. Ruft es jedoch immer noch undefiniertes Verhalten auf, wenn i vom Typ Index ist?
Nein, das ist nicht der Fall. Dies liegt daran, dass der Ausdruck äquivalent wird zu:
i.operator+=(i.operator++());
Da überladene Operatoren Funktionen sind, gelten die normalen Reihenfolgeregeln. Nach der Auswertung von i.operator() existiert ein Sequenzpunkt, sodass die nachfolgende Änderung von i in i.operator =() keine undefinierten Verhaltensregeln verletzt.
Ähnlich sind die Ausdrücke i.add(i .inc()); und ich bin klar definiert. Der erste Ausdruck ist äquivalent zu:
i.operator+=(i.operator++());
Und der zweite Ausdruck ist äquivalent zu:
(i.operator++()).operator++()).operator++();
Jeder dieser Ausdrücke hat einen Sequenzpunkt nach der Auswertung des Operator ()-Ausdrucks , um sicherzustellen, dass das Objekt i zwischen aufeinanderfolgenden Sequenzpunkten nicht zweimal geändert wird.
Indexoperator Überladung
Der Ausdruck:
a[++i] = i;
wobei a ein benutzerdefinierter Typ ist, der den Indexoperator überlädt, ist ebenfalls wohldefiniert. Der Inkrementoperator gibt ein Indexobjekt zurück, das dann zum Indizieren eines Arrays verwendet wird. Der Zuweisungsoperator = entspricht der Methode „operator[]()“, bei der es sich um einen Funktionsaufruf handelt. Daher gelten die Sequenzierungsregeln, und nach der Auswertung von i existiert ein Sequenzpunkt. Folglich ist der Ausdruck wohldefiniert.
Zusätzliche Punkte
Das obige ist der detaillierte Inhalt vonBeseitigt das Überladen von Operatoren in C undefiniertes Verhalten in Ausdrücken wie „i = i'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!