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 回答