当前位置: 首页 > 知识库问答 >
问题:

为什么++(后增量运算符)不能是lvalue?

殷学
2023-03-14

代码

#include<iostream>
int main()
{
    int a=3;
    a++=5;
    std::cout<<a;
}

产出(如预期)

[Error] lvalue required as left operand of assignment

1.post increment运算符(A++)在表中具有最高的优先级。因此它肯定会在赋值运算符(=)之前执行。根据post增量规则,变量A的值只有在执行该语句之后才会增加。

参见a++有rvalue 3,而不是变量本身,对吗?但是如果它带来了一个具有lvalue的变量,那么5将插入其中,在语句结束后,它的值将是6。这有什么问题,为什么做不到?

共有1个答案

公羊曜灿
2023-03-14

根据post增量规则,变量a的值只有在执行该语句后才会增加。

这有点误导人。该变量立即递增。但是表达式的结果是旧值。这将使我们更容易理解为什么它不能是lvalue。修改后的对象没有旧值,因此假设的lvalue不能引用该对象。值是一个新的、临时的对象;它是一个PRValue。

作为一个类比,考虑编写一个函数,它做与post增量相同的事情。这就是它的编写方式(如果您为一个类定义重载操作符重载,那么像这样的函数实际上就是您只需做一些更改就可以编写的):

int post_increment(int& operand)
{
    int old = operand;
    operand += 1;
    return old;
}

您如何有意义地重写该函数以返回一个lvalue(引用),并且仍然具有post增量所期望的行为呢?

 类似资料:
  • 本文向大家介绍什么是JavaScript中的增量(++)运算符?,包括了什么是JavaScript中的增量(++)运算符?的使用技巧和注意事项,需要的朋友参考一下 增量运算符将整数值加1。这是一个示例,其中使用递增运算符两次将a的值递增两次 示例

  • 问题内容: 自从我开始学习Java以来​​已经有3天了。我有这个计划,我不明白,在代码法和运营商。我什至不知道该怎么称呼(这些运算符的名称),谁能解释我的全部意思。 问题答案: 这些称为 前后递增/递减运算符 。 是相同的 是相同的 将运算符放在变量之前,首先要加1,然后使用新的值

  • 问题内容: 当我运行以下示例时,我得到输出0,2,1 我不明白为什么输出是0,2,1而不是0,2,2 问题答案: 意思是现在。调用打印,但返回0,所以和 在此之前,现在想象被调用并替换为0 所以 现在它将是 用简单的话(从这里 @ Piotr) “ i = i ++”大致翻译为 另一个这样的例子: 同样的基本原理

  • 问题内容: 它们都是int的,为什么B&C不能编译?与运算符的区别方式有关吗? 无效的操作参数++ /- 问题答案: 是对变量的赋值。 就您而言,等于。因此,这也意味着没有意义。 更精确地 : 手段 手段 手段 从更一般的角度来看,变量是 L值 ,表示它是指内存位置,因此可以分配。 L 值中的 L 代表赋值运算符(即)的 左侧,即使可以在赋值运算符的左侧或右侧找到L值(例如)。 相反的是 R值 (

  • 问题内容: 我正在做一些有关Java的研究,发现这很令人困惑: 这是永无止境的循环! 有人很好地解释了为什么会发生这种事情吗? 问题答案: 上面的循环与以下内容基本相同:- 3 次你的一部分声明- ,被评估为: - 您需要从此处删除分配,以使其起作用:- (根据评论的OP请求) 的行为:- 就注释中指定的问题而言,以下表达式的结果:- 获得如下:- 让我们标记第二条语句的不同部分:- 现在,首先将

  • 为什么这不会增加?我正在批处理文件中使用这个。它做任何事情都是正确的,只是没有增加。我做错了什么? 编辑:这不是重复,这是一个完全不同的问题。