Reihenfolge der Auswertung in Zuweisungsanweisungen in C
Im angegebenen Codeausschnitt:
map< int, int> mp;<br>printf("%d ", mp.size());<br>mp[10]=mp.size();<br>printf("%dn", mp[10]);<br>
Die scheinbar kontraintuitive Ausgabe von „0 1“ ergibt sich aus der nicht spezifizierten Reihenfolge der Auswertung von Unterausdrücken in Zuweisungen.
Gemäß dem C-Standard ist die Reihenfolge der Auswertung in Zuweisungsanweisungen undefiniert.Das Verhalten ist jedoch wie folgt:
Daher wird im Codeausschnitt mp.size() ausgewertet auf 0 gesetzt und mp[10] zugewiesen. Dann wird mp[10] erneut ausgewertet, was nun den ihm zugewiesenen Wert zurückgibt (1).
Obwohl dieses Verhalten im aktuellen C-Standard nicht spezifiziert ist, wurde es in einem aktuellen Vorschlag behoben ( N4228):
N4228 schlägt vor, die Reihenfolge der Bewertungsregeln zu verfeinern, um sie für bestimmte Fälle, einschließlich des oben genannten, klar zu definieren. Gemäß dem Vorschlag wird der rechte Operand einer Zuweisung vor dem linken Operanden sequenziert.
Dies bedeutet, dass in C 17 und darüber hinaus das Verhalten des Codeausschnitts wahrscheinlich genau definiert sein wird und zu einem führt Ausgabe von „1 1.“
Das obige ist der detaillierte Inhalt vonWie wirkt sich die Reihenfolge der Auswertung in C-Zuweisungsanweisungen auf die Ausgabe aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!