Heim >Backend-Entwicklung >C++ >Warum führt die Zuweisung zu einem Kartenelement in C zu einer unerwarteten Größe?

Warum führt die Zuweisung zu einem Kartenelement in C zu einer unerwarteten Größe?

DDD
DDDOriginal
2024-11-01 08:36:02292Durchsuche

 Why Does Assigning to a Map Element in C   Result in an Unexpected Size?

Bewertungsreihenfolge von Zuweisungsanweisungen in C

Eine rätselhafte Ausgabe kann erhalten werden, wenn einer Karte ein Wert zugewiesen wird:

<code class="cpp">map<int, int> mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);</code>

Dieser Code gibt Folgendes aus:

0 1

Dieses Ergebnis mag kontraintuitiv erscheinen, da man erwarten könnte, dass die Kartengröße nach der Zuweisung 1 beträgt. Allerdings spielt hier die Auswertungsreihenfolge der Zuweisungsanweisung eine entscheidende Rolle.

Die linke Seite der Zuweisung mp[10] gibt eine Referenz auf den zugrunde liegenden Wert des Kartenelements zurück. Gleichzeitig erstellt diese Aktion einen neuen Wert für das mp[10]-Element. Erst nach diesem Vorgang wird die rechte Seite anhand der neu berechneten Größe der Karte ausgewertet.

Dieses Verhalten ist im C-Standard nicht explizit angegeben, fällt aber unter nicht spezifiziertes Verhalten. Ein aktueller Vorschlag, N4228, zielt darauf ab, die Reihenfolge der Bewertungsregeln zu verfeinern, um solche Fälle zu spezifizieren.

Der relevante Abschnitt des Entwurfs des C 11-Standards (1.9) besagt, dass Bewertungen von Unterausdrücken einzelner Ausdrücke im Allgemeinen nicht sequenziert sind. Funktionsaufrufe (wie Operator [] und Size()) werden jedoch vor der Ausführung des Hauptteils der aufgerufenen Funktion sequenziert.

Daher wird der rechte Operand des Zuweisungsausdrucks nach dem linken Operanden sequenziert, was zu … das beobachtete Verhalten. Dies bedeutet, dass die Reihenfolge der Auswertung wie folgt ist:

  1. Bewerten Sie den rechten Operanden: mp.size()
  2. Erstellen Sie den Wert für den linken Operanden: mp[10]
  3. Weisen Sie den Wert des rechten Operanden dem linken Operanden zu

Es wird erwartet, dass eine Aktualisierung des C-Standards dieses Verhalten spezifiziert und klarstellt, dass der rechte Operand eines Zuweisungsausdrucks sequenziert ist vor dem linken Operanden.

Das obige ist der detaillierte Inhalt vonWarum führt die Zuweisung zu einem Kartenelement in C zu einer unerwarteten Größe?. 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