2012-04-13 4 views
0

Ich habe fast nie ein ++ oder - irgendwo außer auf einer eigenen Linie. Ich weiß, dass sie zu undefiniertem Verhalten führen können und die Hölle für das Debuggen sein können. Aber für Ausführlichkeitszwecke bin ich versucht. Ist das ein gültiger Code?Verwendet einen Predecrement-Operator auf der rechten Seite einer Zuweisung gültig C++?

map<int, int> dict; 

... 

int key = ...; 
if (dict.lower_bound(key) != dict.begin()) { 
    int prevval = (--dict.lower_bound(key))->second; 
    ... 
} 

Ich würde wie nur

tun
int prevval = (dict.lower_bound(key)-1)->second; 

aber bidirektionale Iteratoren haben keine operator-() definiert.

Danke!

+0

Wenn Sie sich nicht sicher sind, in welcher Reihenfolge - verwenden Sie weitere Klammern – Ulterior

Antwort

2

Ja, es ist perfekt gültig und funktioniert wie erwartet.

Ein nicht definiertes Verhalten bei der Verwendung dieser Operatoren ergibt sich normalerweise aus der Änderung einer Variablen zwischen Sequenzpunkten, was nicht der Fall ist.

1

Eigentlich machst du eine Initialisierung und keine Zuweisung, aber das ändert nichts.

Ihr Code ist jedoch gültig, da es keine Auswahl in der Reihenfolge der Anwendung aller Operatoren gibt. Sie müssen vorsichtig sein, wenn ein Ausdruck in Unterausdrücke aufgeteilt werden kann, die in beliebiger Reihenfolge ausgewertet werden können.