【问题标题】:why loop is not iterating intended number of times?为什么循环没有迭代预期的次数?
【发布时间】:2023-02-20 20:47:11
【问题描述】:
printf("Enter position : ");
    scanf("%d", &pos);
    printf("Enter element  : ");
    scanf("%d", &element);
    for ( i = 4; i >= (pos-1); i--)
    {   
        a[i+1]=a[i]; // why is this loop only working one time when pos=3
    }

这是我的代码部分,我试图将一个元素插入到大小为 5 的数组中 4 个元素开始将元素转移到下一个索引,但我正在从第五个元素本身转移,即 0(或垃圾值)。我知道这不是实现插入的正确方法,但我的 问题是为什么这行代码不起作用

a[i+1]=a[i];

循环似乎也没有工作 3 次,而是 1 次。

我的原始代码:

#include<stdio.h>

int main(){
    int a[5],i, pos , element;
    printf("Enter elements : ");
    for ( i = 0; i < 4; i++)
    {
        scanf("%d",&a[i]);
    }
    printf("Enter position : ");
    scanf("%d", &pos);
    printf("Enter element  : ");
    scanf("%d", &element);
    for ( i = 4; i >= (pos-1); i--)
    {   
        a[i+1]=a[i];
    }
    a[pos-1]=element;
    for ( i = 0; i < 5; i++)
    {
       printf("%d ",a[i]);
    }
    
    return 0;
}

【问题讨论】:

  • edit 并展示一个简单的输入示例以及实际输出与预期输出。
  • 您是否在调试器中逐步执行代码?

标签: arrays c loops for-loop insertion


【解决方案1】:

这个for循环

for ( i = 4; i >= (pos-1); i--)
{   
    a[i+1]=a[i];
}

i 等于 tp 4 时正在访问数组外的内存,因为表达式 a[i+1] 在这种情况下等效于 a[5],而索引的有效范围是 [0, 4]

所以代码调用未定义的行为。

【讨论】:

    【解决方案2】:

    由于 a 被定义为 int a[5],因此它具有从 a[0]a[4] 的元素。考虑一下如果编译器将 i 放在 a[5] 所在的位置会发生什么。然后,当i为4时,a[i+1] = a[i]覆盖i,这可以将其更改为停止循环的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多