代码之家  ›  专栏  ›  技术社区  ›  Yaroslav

导致错误的后缀和前缀增量

  •  3
  • Yaroslav  · 技术社区  · 7 年前

    为什么该代码由于错误而无法编译:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 0; 
        cout << ++(i++) << " " << i << endl;
        return 0;
    }
    

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int i = 0; 
        cout << (++i)++ << " " << i << endl;
        return 0;
    }
    

    我不明白。在我看来,编译第一个块是很合理的。表达式++(i++)的意思是取i,增加它和输出,然后再次增加它。

    我不是在问int溢出中的未定义行为。在写这个问题的时候,我根本不知道r和l值,我也不在乎为什么++我认为是l值,但我++不是。

    3 回复  |  直到 7 年前
        1
  •  8
  •   Rakete1111    7 年前

    另一方面,预增量的结果是左值,这意味着它可以被后增量安全地修改。

    产生上述规则的原因是,后增量需要返回对象的值,就像应用增量之前一样。顺便说一句,这就是为什么在一般情况下,在非内置对象上使用后增量时,后增量被认为比预增量更昂贵。

        2
  •  2
  •   Vlad from Moscow    7 年前

    ++++++++++++++++i;
    

    对于后增量运算符只有两个加号

    i++;
    

    后缀增量运算符返回一个值(C++标准,5.2.6增量和减量)

    its的价值 [注:获得的值是原始值的副本 结束注释]

    1. 结果是更新后的操作数;这是左值 ...

    ++++++++++++++++一、;
    
        3
  •  1
  •   Marek Vitek    7 年前

    当你用clang编译它时,你会得到一条错误消息,说明了一切。

    <source>:8:13: error: expression is not assignable
    cout << ++(i++) << " " << i << endl;
    

    也许从++运算符开始比较好。事实上,它是 i = i + 1 现在,如果我们看一下postfix版本i++,它在标准中表示,它返回原始值的副本,并作为 side efect 它会增加原始值。 因此,从(i++)中,你得到右值,并试图分配给它,正如我们所知,你不能分配给右值。