Heim > Backend-Entwicklung > C++ > Hauptteil

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

DDD
Freigeben: 2024-11-01 08:36:02
Original
170 Leute haben es durchsucht

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

Dieser Code gibt Folgendes aus:

0 1
Nach dem Login kopieren

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!