Online Compiler C

#include<stdio.h> int main() { int arr[10]; int i; int a; for(i=0;i<10;i++){ scanf("%d",&arr[i]); } a=arr[9]; for(i=1;i<10;i++) { arr[i+i]=arr[i]; } arr[0]=a; for(i=0;i<10;i++){ printf("%d ",arr[i]); } return 0; }
这段代码的目的是将数组元素循环右移一位。它先读入10个整数,然后尝试把最后一个元素移到开头,其他元素依次后移。

代码中存在一个关键错误:在移动元素的循环中,`arr[i+i]` 的写法不正确。当 `i` 从1开始递增时,`i+i` 会变成2、4、6...,这会导致数组元素被错误地覆盖,而不是按顺序后移一位。

- 提示1:思考一下,要把数组元素依次后移一位,应该用怎样的索引表达式?`arr[i+i]` 在 i=1 时访问的是 arr[2],跳过了 arr[1],这不符合后移的逻辑。
- 提示2:注意循环的方向。如果从前往后移动元素,后面的值会被覆盖。考虑是否应该从后往前遍历,这样每个元素移动时不会丢失尚未移动的数据。