Онлайн компилятор 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<9;i++) { arr[i+1]=arr[i]; } arr[0]=a; for(i=0;i<10;i++){ printf("%d ",arr[i]); } return 0; }
这段代码的目的是将数组中的元素循环右移一位,即最后一个元素移到第一个位置,其他元素依次后移一位。但代码的实现逻辑有误。

- 代码从 `i=1` 到 `i<9` 循环,将 `arr[i]` 赋值给 `arr[i+1]`。这会导致从第二个元素开始,每个元素被覆盖到下一个位置,但覆盖的顺序是从左到右,所以后面的元素会被前面的新值覆盖,而不是保留原始值。例如,`arr[2]` 先被 `arr[1]` 覆盖,然后 `arr[3]` 又被新的 `arr[2]` 覆盖,最终所有元素都变成了原来 `arr[1]` 的值。

- 正确的思路应该是从数组的末尾开始向前移动元素,或者使用一个临时变量来保存被覆盖的值。