Heim >Backend-Entwicklung >C++ >Beseitigt das Überladen von Operatoren in C undefiniertes Verhalten in Ausdrücken wie „i = i'?

Beseitigt das Überladen von Operatoren in C undefiniertes Verhalten in Ausdrücken wie „i = i'?

Barbara Streisand
Barbara StreisandOriginal
2024-12-04 00:22:09715Durchsuche

Does Overloading Operators in C   Eliminate Undefined Behavior in Expressions like `i  =   i`?

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

  • Die Anzahl der mit einem Ausdruck verknüpften Sequenzpunkte hängt von den beteiligten Operandentypen ab. wie der Fall von i = i zeigt.
  • In C 03 ist der Ausdruck i wohldefiniert.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn