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
Freigeben: 2024-12-04 00:22:09
Original
659 Leute haben es durchsucht

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;
Nach dem Login kopieren

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++());
Nach dem Login kopieren
Nach dem Login kopieren

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++());
Nach dem Login kopieren
Nach dem Login kopieren

Und der zweite Ausdruck ist äquivalent zu:

(i.operator++()).operator++()).operator++();
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage