首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在组合增量运算符时得到"error: expression is not assignable“

为什么我在组合增量运算符时得到"error: expression is not assignable“
EN

Stack Overflow用户
提问于 2019-07-25 17:27:40
回答 1查看 220关注 0票数 2

我正在尝试连接post和pre-increment运算符。我看到,对于一些涉及post操作符的组合,我得到了不可分配的错误。这是因为一旦定义了j的值,post运算符就会被计算。有人能给我更深层次的理解吗?

我正在尝试这些奇怪的场景,因为我试图在c++中变得更好。如果有什么方法可以学得更好。我将不胜感激。

代码语言:javascript
复制
#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";
}
EN

回答 1

Stack Overflow用户

发布于 2019-07-25 17:29:36

不同之处在于前缀运算符++返回左值,而后缀运算符++返回右值。

例如,您可以这样写(偶数的多个加号)

代码语言:javascript
复制
j = ++++++++i;

但你只能写(只有两个加号)

代码语言:javascript
复制
j = i++;

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

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

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

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

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

代码语言:javascript
复制
#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;
}

它的输出是

代码语言:javascript
复制
10
12

不同之处在于下标运算符是通过使用后缀表达式定义的。

因此,这个表达式p++[0]等同于( p++ )[0]

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57198625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档