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