2012-04-13 7 views
0

私は++や - をどこかの行に置くことはほとんどありません。私はそれらが未定義の動作につながる可能性があり、デバッグのために地獄になる可能性があることを知っています。しかし、冗長な目的のために、私は誘惑を受けます。この有効なコードですか?割り当ての有効なC++の右側にあるプレデクリメント演算子を使用していますか?

map<int, int> dict; 

... 

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

私はちょうど

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

を行うためにようをいただきたいが、双方向イテレータはoperator-()が定義されていません。

ありがとうございます!

+0

操作シーケンスが不明な場合は、括弧を使用してください – Ulterior

答えて

2

はい、完全に有効で、期待どおりに動作します。

これらの演算子を使用するときの未定義の動作は、通常、シーケンスポイント間で変数を複数回変更することに起因します。

1

実際には、初期化ではなく割り当てを行っていますが、何も変更されません。

ただし、すべての演算子を適用する順番に選択肢がないため、コードは有効です。式を任意の順序で評価できる部分式で分割できるかどうかは注意が必要です。

関連する問題