在赋值有效的C ++的右侧使用预定义运算符?

时间:2012-04-13 17:53:10

标签: c++ stl pre-increment

我几乎从不把一个++或 - 除了自己的行以外的任何地方。我知道他们可能会导致未定义的行为,并且可能是调试的地狱。但出于冗长目的,我很受诱惑。这是有效的代码吗?

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-()

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,它完全有效并按预期工作。

使用这些运算符时的未定义行为通常来自在序列点之间多次修改变量,这不是您的情况。

答案 1 :(得分:1)

实际上你正在进行初始化而不是分配,但这并没有改变任何东西。

但是,您的代码有效,因为没有选择应用所有运算符的顺序。如果表达式可以在子表达式中拆分,可以按任意顺序进行求值,则必须小心。