请有人解释我。为什么用C ++
array[i] = array[++i];
不像array[i] = array[i + 1];
那样有效
但i = ++i;
确实有效i = i + 1;
答案 0 :(得分:2)
赋值运算符的左右操作数的值评估未按顺序排列。 因此这个表达
array[i] = array[++i];
可以表现得像
array[i] = array[i + 1];
或喜欢
array[i + 1] = array[i + 1];
另一方面(C ++标准)
...在所有情况下,赋值在值计算之后排序 左右操作数,
因此在这个表达中
i = ++i;
左操作数将被++ i。
的值覆盖答案 1 :(得分:0)
您的问题的答案是关于pre-increment
的返回值,没有增量和post-increment
。
表达式++i
递增变量,然后返回递增的值。
表达式i++
递增变量,在递增之前返回值。
因此,表达式array[i + 1]
和array[++i]
引用相同的元素,除了数组[++ i]具有递增索引变量的副作用。
答案 2 :(得分:-1)
您遇到的问题是您误解了++i
发生的事情。
++i
是一个声明,在评估当前行之前递增并将结果放在表达式中。 ++i
的作用就像添加一个并分配一样,因为它本质上就是它的作用!这些陈述是等价的:
array[i] = array[ ++i ]
array[i] = array[ i = i + 1 ]
请记住,赋值运算符从右侧返回值(指定的新值)。 仅之所以与array[i + 1]
不同,是因为i
已经改变的副作用。
现在,关于i = ++i
。使用相同的逻辑,我们可以用
i = (i = i + 1)
现在观察一旦你分配了i
,就会在右侧返回值...当然这意味着相当于:
i = i + 1