希望实现对数组的前挪,写了以下代码
#include <stdio.h>
int main(int argc, char *argv[])
{
int arr[] = {0, 1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
int i = 0;
while (i < len - 1)
{
arr[i] = arr[++i];
}
for (i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
期望得到的结果是
[1,2,3,4,5,5]
代码运行结果
可是结果依然是[0,1,2,3,4,5]
我又用c++测试了一次,均不能实现我的想法
发现如此使用才可以
这就让人不得不思考,这两种方式差别在哪里了,
从最后这段代码可以知道,顺序应该是确定a[i],然后让i自增,所以在取下个a[i]时取到了自增后的i。
从上一段代码模仿第一段代码的思路,应当是先取左值a[i],再取自增后的i对应的a[i],但这思路与现实大相径庭。
通过查看地址发现
它确实是移动了,我猜应该要同一条语句才会出现问题,所以再测试了一下同一条语句
居然还是没有问题,再变回数组呢?
好像出现问题了两个输出的都是2,这是我第一次遇到这种坑,目前还没理解什么原因,但是这个坑要记录一下提醒自己。
找到了问题的成因