


Undefiniertes Verhalten und Sequenzpunkte: Ein tieferer Einblick
Der Ausdruck i = i; wurde als Aufruf undefinierten Verhaltens (UB) gekennzeichnet, aber was ist, wenn der Typ von i benutzerdefiniert ist, wie in der bereitgestellten Indexklasse?
Benutzerdefinierte Typen und UB
Bei benutzerdefinierten Typen wie Index ist der Ausdruck i = i; gilt immer noch als UB. Dies liegt daran, dass der benutzerdefinierte Typ das Standardverhalten der Inkrementoperatoren nicht überschreibt. Die Funktionen „operator ()“ und „operator =()“ ändern nur den internen Status des Indexobjekts und erstellen keine Sequenzpunkte. Daher ändert der Ausdruck das Objekt zweimal zwischen aufeinanderfolgenden Sequenzpunkten, was zu UB führt.
Äquivalenz von Ausdrücken
Die Ausdrücke i.operator =(i.operator () ); und i.add(i.inc()); sind nicht äquivalent zum Original i = i;. Im ersten Ausdruck ermöglicht der Sequenzpunkt nach der Auswertung von i.operator() die Änderung des Indexobjekts vor der Auswertung des =-Operators. Ebenso verändern im zweiten Ausdruck die Mitgliedsfunktionen add und inc das Objekt zwischen aufeinanderfolgenden Sequenzpunkten nicht. Daher rufen diese Ausdrücke kein UB auf.
Ausdrucksdefinition und Sequenzpunkte
Der Ausdruck i = i; ist zwar ein Ausdruck, aber sein Verhalten ist nicht genau definiert. Die Anzahl der mit einem Ausdruck verknüpften Sequenzpunkte hängt nicht von der Art der beteiligten Operanden ab.
Array-Subskription (a[ i] = i)
Der Ausdruck a [ ich] = ich; ist auch UB in beiden Fällen, wenn a ein Array eines integrierten Typs ist oder wenn a ein benutzerdefinierter Typ ist, der den Indexoperator überlädt. In beiden Fällen wird zuerst der Ausdruck [i] ausgewertet, der i inkrementiert und seinen vorinkrementierten Wert zurückgibt. Dieser Wert wird dann als Index im Array verwendet, was zu UB führen kann, wenn der Index außerhalb der Grenzen liegt.
Mehrere Inkrementierungsoperationen (i)
Der Ausdruck i; ist in C 03 wohldefiniert und hat das gleiche Verhalten wie der Ausdruck ((((i.operator ()).operator ()).operator ()).operator ()).operator ());. Jeder Aufruf des Operators () gibt einen Verweis auf das Indexobjekt zurück, und die Sequenzpunkte nach jeder Funktionsauswertung stellen sicher, dass das Objekt nur einmal zwischen aufeinanderfolgenden Sequenzpunkten geändert wird.
Fazit
Zusammenfassend sind die Ausdrücke i = i; und a[ i] = i; Rufen Sie UB für benutzerdefinierte Typen auf, auch wenn die Typen überladene Operatoren bereitstellen. Mehrere Inkrementoperationen für Indexobjekte sind gut definiert und zeigen, dass Sequenzpunkte und die Anzahl der Änderungen an einem Objekt zwischen Sequenzpunkten unabhängig von der Art der beteiligten Operanden sind.
Das obige ist der detaillierte Inhalt vonIst „i = i;' auch bei benutzerdefinierten Typen ein undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

In diesem Artikel werden die C -Standard -Vorlagenbibliothek (STL) erläutert, die sich auf seine Kernkomponenten konzentriert: Container, Iteratoren, Algorithmen und Funktoren. Es wird beschrieben, wie diese interagieren, um die generische Programmierung, die Verbesserung der Codeeffizienz und die Lesbarkeit t zu ermöglichen

Dieser Artikel beschreibt die effiziente Verwendung von STL -Algorithmus in c. Es betont die Auswahl der Datenstruktur (Vektoren vs. Listen), Algorithmus -Komplexitätsanalyse (z. B. std :: sortieren vs. std :: partial_sort), Iteratoranwendungen und parallele Ausführung. Häufige Fallstricke wie

In diesem Artikel wird die effektive Ausnahmebehandlung in C, Covering Try, Catch und Wurp Mechanics, beschrieben. Es betont Best Practices wie Raii, die Vermeidung unnötiger Fangblöcke und die Protokollierung von Ausnahmen für robusten Code. Der Artikel befasst sich auch mit Perf

In dem Artikel wird die Verwendung von Move Semantics in C erörtert, um die Leistung zu verbessern, indem unnötiges Kopieren vermieden wird. Es umfasst die Implementierung von Bewegungskonstruktoren und Zuordnungsbetreibern unter Verwendung von STD :: MOVE

C 20 -Bereiche verbessern die Datenmanipulation mit Ausdruckskraft, Komposition und Effizienz. Sie vereinfachen komplexe Transformationen und integrieren sich in vorhandene Codebasen, um eine bessere Leistung und Wartbarkeit zu erhalten.

In dem Artikel wird der dynamische Versand in C, seine Leistungskosten und Optimierungsstrategien erörtert. Es unterstreicht Szenarien, in denen der dynamische Versand die Leistung beeinflusst, und vergleicht sie mit statischer Versand, wobei die Kompromisse zwischen Leistung und Betonung betont werden

Artikel erörtert den effektiven Einsatz von RValue -Referenzen in C für Bewegungssemantik, perfekte Weiterleitung und Ressourcenmanagement, wobei Best Practices und Leistungsverbesserungen hervorgehoben werden. (159 Charaktere)

C Speicherverwaltung verwendet neue, löschende und intelligente Zeiger. In dem Artikel werden manuelle und automatisierte Verwaltung erörtert und wie intelligente Zeiger Speicherlecks verhindern.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SublimeText3 Englische Version
Empfohlen: Win-Version, unterstützt Code-Eingabeaufforderungen!

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

Dreamweaver Mac
Visuelle Webentwicklungstools