„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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?

Veröffentlicht am 04.11.2024
Durchsuche:959

 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:

map mp;
printf("%d ", mp.size());
mp[10] = mp.size();
printf("%d\n", mp[10]);

Dieser Code gibt aus:

0 1

Dieses Ergebnis mag kontraintuitiv erscheinen, wie man es vielleicht erwarten würde Die Kartengröße muss nach der Zuweisung 1 sein. 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 dieser Operation wird die rechte Seite unter Verwendung 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 (z. B. Operator [] und Größe ()) werden jedoch vor der Ausführung des aufgerufenen Funktionskörpers 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. Werten Sie den rechten Operanden aus: 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.

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3