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:
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!