- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在 C++ 中,
i = ++++j;
在代码中工作正常,但是当我使用时,
i = j++++;
我收到以下错误:
Operand for operator "++" must be an lvalue.
为什么会出现此错误?
最佳答案
后增要求操作数应该是一个可修改的左值,但后增的结果是prvalue (“纯”右值)不可修改,此图显示了正在发生的事情:
i = (j++)++ ;
^ ^
| |
| Result is a prvalue, not a valid operand for subsequent post-increment
Modifiable lvalue
Understanding lvalues and rvalues in C and C++如果您需要了解左值 和右值 之间的区别,这是一个很好的起点。来自draft C++ standard 5.2.6
Increment and decrement [expr.post.incr] 段落 1 says(强调是我的):
The value of a postfix ++ expression is the value of its operand. [ Note: the value obtained is a copy of the original value —end note ] The operand shall be a modifiable lvalue. [..] The result is a prvalue.
更新
我针对未定义的行为修改了我的语言,因为这里在 C++03 和 C++11 方面存在差异。
虽然第一个表达式显示:
i = ++++j ;
不会生成错误,但如果这是 C++03 并且 j
是基本类型,则为 undefined behavior因为在 sequence point 中多次修改它的值未定义。 older draft standard 中的相关部分将是 5
Expressions 段 4 ,它说:
[...]Between the previous and next sequence point a scalar object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be accessed only to determine the value to be stored. The requirements of this paragraph shall be met for each allowable ordering of the subexpressions of a full expression; otherwise the behavior is undefined.
并给出了一些例子,其中之一如下:
i = ++i + 1; // the behavior is undefined
在 C++11 中,语言更改对同一标量对象的副作用相对于对同一对象的另一个副作用是无序的,因此行为未定义。所以这实际上在 C++11 中有很好的定义,在 1.9
Program execution 段落 15 中说:
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced. [...] If a side effect on a scalar object is unsequenced relative to either another side effect on the same scalar object or a value computation using the value of the same scalar object, the behavior is undefined.
在赋值之前或之后使用 j +=2
以这种方式使用后递增和预递增不会产生可读(可维护)代码声明就足够了
关于c++ - 错误 : Operand for operator "++" must be an lvalue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18819570/
我正在尝试为一个简单的数学 Vector 类重载 += 运算符,以对两个 vector 的元素求和,如下所示: vector1 += vector2 部分Vector2D.h: #ifndef _VE
我正在尝试在 ASM 中编写一个简单的 for 循环。我需要访问两个数组,它们是在 C++ 代码片段之外编写的(即 OrigChars 和 EncrChars) char temporary_
Qt 版本 5.01 平台 windows 64 位 问题:错误:没有操作数“ #include #include #include namespace { std::ost
#include #include #define SIGBAD(signo) ((signo) = NSIG) int sigaddset(sigset_t *set, int signo
请看下面的代码。我正在使用 Apache Derby 作为嵌入式数据库 public List getDetails(String name) { List details =
我和我的讲师/实验室助理都被难住了。 出于某种原因,以下 HLSL 代码在输出窗口中返回: error X8000 : D3D11 Internal Compiler error : Invalid
我有一个创建时间跟踪器的 NPM 包,它使用 for in 来定位 MD 文件的标题,然后将其转换为跟踪器。目前,在 Mac 上运行它时工作正常,在 Windows 上我收到 dirname:miss
请注意这个问题是不是 this 的副本或 this ,因为其他问题没有运算符(operator) 组件,不要询问我正在询问的参数和参数的详细信息。 我将使用 vb.net 教授第一门编程类(class
输入 sudo apt autoremove 后出现此错误在终端 readlink: missing operand Try 'readlink --help' for more informatio
为什么 GCC 给我这个错误?我在这里做错了什么? temp.c: In function main: temp.c:6: error: invalid operands to binary +
我对此很陌生,我正在尝试将值从一个数组移动到另一个数组, 它假设是: vec1 = 1, 2, 3, 4, 5 vec2 = 5, 4, 3, 2, 1 但我收到一个错误:“指令操作数必须是相同的大小
我有一个 OR 表达式,它应该返回不是 NaN 的操作数: (1 || NaN) // evaluates to 1 (NaN || 1) // evaluates to 1 但是当另一个操作数也是一
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 4 年前。 Improve th
这道题是基于 Javascript 的,但适用于一般的逻辑运算 拿代码举例 if (baseText[i] == "."){ /*splice array*/;} if (baseText[
我似乎无法找到使程序运行的问题。 C 告诉我“错误:二进制操作数无效!= 'grocerylist'(又名 structgrocerylist)和 'int' 当我尝试解决此问题时,会弹出其他错误,除
我正在查看 the docs并尝试了解运算符的实际工作方式。 The increment operator (++) increments its operand by 1. The incremen
我有一个很长的 json 字符串,"attributeName":"Loc ID"},"operands":["10000"]}],"Frequency":{"type":" 这个只是其中的一部分,我
目前,我尝试编译 OpenVDB,它依赖于 Threading Building Blocks。我收到以下错误: In file included from /usr/include/tbb/enum
我收到的错误: /usr/include/c++/7/bits/stl_function.h:386: error: no operator " NearestNeighbor::nearest_pa
我有一个类Color , 那有 friend std::ostream& operator void print_head(const T& head, sost& o) { o (rsym,
我是一名优秀的程序员,十分优秀!