【问题标题】:Is using a predecrement operator on the right hand side of an assignment valid C++?在赋值的右侧使用预减运算符是否有效 C++?
【发布时间】:2012-04-13 17:53:09
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 如果您不确定该操作顺序 - 使用更多括号

标签: c++ stl pre-increment


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    实际上你是在做一个初始化而不是一个赋值,但这并没有改变任何东西。

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

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      相关资源
      最近更新 更多