Heim > Backend-Entwicklung > C++ > Warum führt die Zuweisung eines Kartenwerts in C zu unerwarteten Ergebnissen?

Warum führt die Zuweisung eines Kartenwerts in C zu unerwarteten Ergebnissen?

DDD
Freigeben: 2024-10-28 15:10:02
Original
581 Leute haben es durchsucht

 Why Does Assigning a Map Value in C   Produce Unexpected Results?

Bewertungsreihenfolge in C-Zuweisungsanweisungen

Beim Zuweisen eines Werts zu einer Karte in C kann die Bewertungsreihenfolge zu kontraintuitiven Ergebnissen führen. Betrachten Sie den folgenden Code:

map<int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>

Dieser Code gibt 0 und dann 1 aus, während man 0 und 0 erwarten könnte. Dies liegt daran:

  1. Rechts-nach-Links Auswertung: Zuweisungsoperatoren in C assoziieren von rechts nach links, was bedeutet, dass mp[10] vor mp.size() ausgewertet wird.
  2. Temporäre Referenz: Die linke Seite der Zuweisung mp[10] erstellt einen temporären Verweis auf das zugrunde liegende Kartenelement. Dieses Element ist zunächst nicht initialisiert, daher gibt mp.size() zunächst 0 zurück.
  3. Wertänderung: Die Zuweisung mp[10]=mp.size() legt den Wert von mp[10 fest ] auf die aktuelle Größe der Karte, die 0 ist.
  4. Verlängerung der Referenzlebensdauer: Die Zuweisung verlängert vorübergehend die Lebensdauer der von mp[10] erstellten temporären Referenz.
  5. Endgültige Bewertung: mp[10] zeigt jetzt auf das geänderte Element, also printf("%d", mp[10]); gibt den aktualisierten Wert von 1 aus.

Nicht spezifiziertes Verhalten

Dieses besondere Verhalten ist im C-Standard nicht spezifiziert. Ein aktueller Vorschlag (N4228) versucht jedoch, die Reihenfolge der Auswertung in solchen Fällen zu klären.

Abschnitt [expr.ass]p1 des überarbeiteten Vorschlags besagt:

"Der rechte Operand ist sequenziert vor dem linken Operanden.“

Das bedeutet, dass im obigen Beispiel mp.size() vor mp[10] ausgewertet würde, was zur erwarteten Ausgabe von 0 und 0 führt.

Update

Es ist wichtig zu beachten, dass dieses Verhalten in C 17 im Standard spezifiziert wurde, gemäß Revision 3 des Vorschlags p0145. Der rechte Operand wird jetzt in Zuweisungsanweisungen explizit vor dem linken Operanden eingeordnet.

Das obige ist der detaillierte Inhalt vonWarum führt die Zuweisung eines Kartenwerts in C zu unerwarteten Ergebnissen?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage