【问题标题】:Post-Increment of an Post-Increment in C++C++ 中后增量的后增量
【发布时间】:2021-07-03 19:38:32
【问题描述】:

如果我在 C++ 中使用嵌套递增运算符,例如

int a = 1;
int b = (a++)++;

它给出了一个编译时错误:

error: lvalue required as increment operand

但是,如果我写

int a = 1;
int b = ++(++a);

b 的新值变为 3。

这是什么原因?

【问题讨论】:

  • 原因是价值类别。后增量只能在左值上,但返回右值。另外,请通过编辑问题向问题添加信息,而不是通过发布 cmets。
  • 但是……为什么还要麻烦……尝试编写像这个问题一样的代码有什么用处 - 你永远不会在生产代码中写这个……你会吗?

标签: c++ increment


【解决方案1】:

(a++) 返回一个临时右值,其旧值为a。右值没有可用的后增量运算符。

【讨论】:

  • int a = 1; int b = (a++) + (a++);”中b的值是多少 ???如果是2,那么我不明白我的答案(o_O)的所有反对票 - 你说“旧值”,我说它直到分号才改变。
  • @Top-Master 你在我回答后更新了你的答案。您上面的示例导致未定义的行为。
  • 你能定义什么是未定义的吗?您的意思是 C++ 规范让编译器使用“int b = (a++) + (a++);”代码为所欲为吗?
  • @Top-Master 在; 之后没有做任何事情。你误会了什么
  • @Top-Master 程序集无法证明标准是如何规定的,尤其是当代码有 UB 查看程序集时只会产生误导
【解决方案2】:

这里的原因是对后增量产生的结果执行后增量是没有意义的。

让我们先看看a++到底做了什么:

int operator++(int)
{
    auto temp = *this;
    *this += 1;
    return temp;
}

所以当你执行a++ 时,a 会增加1,然后它会返回一个临时值,该值等于以前的a

现在想象一下,如果您第二次执行此操作,您实际上要做的是:

int post_increment_twice()
{
    auto temp1 = *this;
    *this += 1;
    auto temp2 = temp1;
    temp1 += 1;
    return temp2;
}

您会注意到结果与 post increment once 完全相同。

  • *this 增加了一次
  • 然后您返回值 *this 曾经是。

  • 事实上,对任何临时值执行后增量是没有意义的。

后增量对函数内部的值执行增量。但是,通过传入一个临时值,您将失去对递增对象的访问权限。并返回一个与增加之前的临时值相等的值。


虽然可以为自定义类重载后增量运算符以接受临时值。但是对于整数,接受它根本没有意义,因此它是不允许的。

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 2014-05-03
    • 2012-01-24
    • 2012-10-17
    • 2011-09-18
    • 2012-09-15
    • 2012-03-07
    相关资源
    最近更新 更多