Online Compiler C

#include <stdio.h> int main() { const int n = 10; int arr[n]; int i, l; for (i = 0; i < 10; i++) { scanf("%d", &arr[i]); } l=arr[9]; for(i=0;i<10;i++){ arr[i]=arr[i-1]; } arr[0]=l; for(i=0;i<10;i++){ printf("%d",arr[i]); if (i!=9){ printf(" "); } } printf("\n"); return 0; }
这段代码试图将数组中的元素循环右移一位,即最后一个元素移到第一个位置,其余元素依次后移。但代码中存在一个逻辑错误。

- 在第二个循环中,当 `i=0` 时,`arr[i-1]` 访问了 `arr[-1]`,这是数组越界,会导致未定义行为。正确的思路应该是从后往前遍历,避免覆盖未移动的元素。
- 另外,变量 `l` 保存了最后一个元素的值,但循环中直接使用 `arr[i]=arr[i-1]` 会丢失中间元素的值,因为后一个元素被前一个元素覆盖了。

- 提示:考虑从数组的末尾开始向前移动元素,这样就不会覆盖尚未移动的值。
- 提示:注意循环的起始和结束索引,确保不会访问数组边界之外的位置。