当我运行这段代码时,我得到一个输出:21 20 18 15 11 6
请解释一下我们是如何得到这个输出的。
#define N 6
int main(void)
{
int i,j,a[N]={1,2,3,4,5,6};
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
return 0;
}
当我运行这段代码时,我得到一个输出:21 20 18 15 11 6
请解释一下我们是如何得到这个输出的。
#define N 6
int main(void)
{
int i,j,a[N]={1,2,3,4,5,6};
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
return 0;
}
当您在第二个 for 循环中看到每个结果时,也许更容易理解:
[1、2、3、4、5、6]
[3、2、3、4、5、6]
[6、2、3、4、5、6]
[10、2、3、4、5、6]
[15、2、3、4、5、6]
[21, 2, 3, 4, 5, 6] 现在我增加了
[21、5、3、4、5、6]
[21、9、3、4、5、6]
[21、14、3、4、5、6]
[21, 20, 3, 4, 5, 6] 现在我增加了
[21、20、7、4、5、6]
[21、20、12、4、5、6]
[21, 20, 18, 4, 5, 6] 现在我增加了
[21、20、18、9、5、6]
[21, 20, 18, 15, 5, 6] 现在我增加了
[21、20、18、15、11、6]
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
for(i=0;i<N;i++)
printf("%d",a[i]);
a[N]={1,2,3,4,5,6};
进行跟踪是最简单的方法。#DEFINE 中的 N = 6 因此第一个 for 循环将执行 6 次
第一次运行
当 i = 0 j= 1
一[0] += 一[1]
所以现在 a[0] 等于 3
j++ 所以 j 现在等于 2
我 = 0 j = 2
一[0] += 一[2]
等于 a[0] (即 3)加上 a[2] 即 3 这等于 6。
j++ 所以 j 现在等于 2
如果继续跟踪,您将看到它正在将数组的其余部分相加,即 1+2+3+4+5+6 = 21
那么下一次迭代是 2+3+4+5+6
等等
您的程序对数组“a”的元素求和。第一个循环确定起始索引,内部循环对数组的元素求和(考虑起始索引 i)。最后,a[0] 包含所有数组元素的总和,a[1] 包含从索引 1 开始的所有数组元素的总和,依此类推。
后
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
a[i]+=a[j];
的价值
a[0] = 1+2+3+4+5+6 = 21
a[1] = 2+3+4+5+6 = 20
a[2] = 3+4+5+6 = 18
a[3] = 4+5+6 = 15
a[4] = 5+6 = 11
a[5] = 6 = 6
和
printf("%d",a[i]);
应该
printf("%d\n",a[i]);