【问题标题】:Why am i getting "error: expression is not assignable" for combining increment operators为什么我收到“错误:表达式不可分配”以组合增量运算符
【发布时间】:2019-12-03 12:49:55
【问题描述】:

我正在尝试连接 post 和 pre-increment 运算符。我看到对于一些涉及 post 运算符的组合,我得到了不可分配的错误。是不是因为一旦定义了 j 的值,就会评估 post 运算符。谁能让我对此有更深入的了解?

我正在尝试这些奇怪的场景,因为我想在 C++ 中变得更好。如果有更好的学习方法。将不胜感激。

#include <iostream>
int main() {
    int j = 0;
    int i = 0;
    // This works
    j = (++i)++;
    std::cout << "J is: " << j << "\n";

    // This doesn't
    j = ++(i++);
    std::cout << "J is: " << j << "\n";

    // This does
    j = (i++);
    std::cout << "J is: " << j << "\n";

    // This doesn't
    j = (i++)++;
    std::cout << "J is: " << j << "\n";
}

【问题讨论】:

    标签: c++ increment lvalue post-increment pre-increment


    【解决方案1】:

    区别在于前缀运算符++返回一个左值,而后缀运算符++返回一个右值。

    例如,你可以写(偶数的多个加号)

    j = ++++++++i;
    

    但你可以只写(只有两个加号)

    j = i++;
    

    来自 C++17 标准((后缀)8.5.1.6 增量和减量)

    1 后缀++表达式的值是其操作数的......

    和((前缀)8.5.2.2 递增和递减)

    1 ... 结果是更新的操作数;它是一个左值...

    相对于您的问题,请考虑后增量和前增量之间的一个更有趣的区别。这是一个演示程序

    #include <iostream>
    
    int main() 
    {
        int a[] = { 10, 20 };
    
        int *p = a;
    
        std::cout << p++[0] << '\n';
    
        p = a;
    
        std::cout << ++++p[0] << '\n';
    
        return 0;
    }
    

    它的输出是

    10
    12
    

    区别在于下标运算符是通过后缀表达式定义的。

    所以这个表达式p++[0]等价于( p++ )[0]

    虽然这个表达式++++p[0] 等价于++++( p[0] )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      相关资源
      最近更新 更多