In C ist die Reihenfolge der Auswertung für Zuweisungsanweisungen nicht immer intuitiv. Betrachten Sie den folgenden Code:
<code class="cpp">map<int, int> mp; printf("%d ", mp.size()); mp[10]=mp.size(); printf("%d\n", mp[10]);</code>
Dieser scheinbar unkomplizierte Code gibt überraschenderweise „0 1“ aus, was möglicherweise nicht das ist, was Sie erwarten würden.
Um zu verstehen, warum, müssen wir uns damit befassen Besonderheiten der C-Bewertungsreihenfolge. Zuweisungsanweisungen, wie in [expr.ass](https://en.cppreference.com/w/cpp/sprache/operator_assignment) des C-Standards angegeben, „alle gruppieren von rechts nach links“. Das bedeutet, dass der rechte Operand vor dem linken Operanden ausgewertet wird. Darüber hinaus legt der C-Standard fest, dass bei einer Zuweisungsoperation „die Zuweisung nach der Wertberechnung des rechten und linken Operanden und vor der Wertberechnung des Zuweisungsausdrucks sequenziert wird.“
In unserem Code wird die Der linke Operand ist mp[10], was selbst eine Zuweisungsoperation ist. Der rechte Operand ist mp.size(), der 0 ergibt, da die Karte zunächst leer ist. Der Code weist mp[10] also effektiv 0 zu. Die Zuweisungsoperation wird jedoch vor der Wertberechnung von mp[10] sequenziert. Dies bedeutet, dass zunächst der Wert von mp[10] geändert wird, wodurch ein neuer Eintrag in der Karte erstellt und auf 0 gesetzt wird. Erst dann wird der Wert von mp[10] ausgewertet und der neu erstellte Eintrag mit dem Wert 1 angezeigt .
Dies ist ein klares Beispiel für die scheinbar unerwartete Reihenfolge der Bewertung in C . Um solche Überraschungen zu vermeiden, ist es wichtig, die Spezifikationen des Standards zu kennen und die Reihenfolge zu berücksichtigen, in der die Vorgänge ausgeführt werden. In Fällen, in denen die Reihenfolge nicht entscheidend ist oder die Möglichkeit für undefiniertes Verhalten besteht, können explizite Klammern verwendet werden, um die Auswertungsreihenfolge zu steuern.
Das obige ist der detaillierte Inhalt vonWarum gibt „mp[10] = mp.size()' „1' in C aus, auch wenn „mp' leer ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!