0

++ や -- は、それ自体の行以外にはほとんど入れません。それらが未定義の動作につながる可能性があり、デバッグにとって地獄になる可能性があることはわかっています。しかし、冗長な目的のために、私は誘惑されます。これは有効なコードですか?

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-()ただし、双方向イテレータは定義されていません。

ありがとう!

4

2 に答える 2

2

はい、完全に有効であり、期待どおりに機能します。

これらの演算子を使用するときの未定義の動作は、通常、シーケンス ポイント間で変数を複数回変更することから発生しますが、これはあなたのケースではありません。

于 2012-04-13T17:54:41.387 に答える
1

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

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

于 2012-04-13T18:09:42.980 に答える