为什么索引与常规变量不同

时间:2015-03-10 19:47:57

标签: c++ arrays

请有人解释我。为什么用C ++     array[i] = array[++i];不像array[i] = array[i + 1];那样有效 但i = ++i;确实有效i = i + 1;

3 个答案:

答案 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