首页 > 解决方案 > for 循环中的变量是否跟踪前一个数字?

问题描述

在这个例子中,假设array[1]是 50 和array[2]64,是否会sum跟踪前一个数字?
当 0 加到 50 之后,它会再次循环,是 50 = 0 + 64 吗?

//adds up all the numbers in the array and divide by how much is there
float average(int length, int array[])
{
    int sum = 0;
    for(int i = 0; i < length; i++)
    {
       int sum = sum + array[i];
    }
    return sum / length;
}

标签: c

解决方案


sum循环内部是该循环外部的阴影 sum。您需要了解变量范围以了解为什么它不能按预期工作。当您输入一段代码(用花括号指定{ ... })时,您的自动变量(在大多数实现中存在于堆栈中的那些)会激活,而当您离开该代码块时会死亡。因此,当您进入average函数时,您已声明sum的局部变量 ( ) 和参数 ( lengthand array[]) 会活跃起来。for循环是另一个块,在其中,第二个是sum活跃的。由于两个变量具有相同的名称,因此最内层sum是所操作的,遮蔽/阻塞了外层sum。此外,由于for循环是循环的,你在循环的每次迭代中进入和离开它的块。

for(int i = 0; i < length; i++)
{  // enter the block here, inner sum comes alive
  int sum = sum + array[i];  
}  // leave the block here, inner sum dies

这意味着对于每个循环,您都在sum进入时创建内部,并在离开时销毁它。当你循环通过时,你实际上是在做

int (inner) sum = (outter) sum + array[0];
int (inner) sum = (outter) sum + array[1];
int (inner) sum = (outter) sum + array[2];
// etc

其中每个int (inner) sum都是一个新变量。

由于 outtersum为 0,inner仅在短时间内sum被初始化为 的值,直到它在退出块时被销毁,而不会在其他地方使用或保存。array[i]实际上,编译器会认识到整个for循环是无用的,并将其优化掉。

如果要对整个数组求和,则需要将数组值添加到 outter sum;您不需要循环sum内的其他变量。for

float average(int length, int array[])
{   // outter sum, length, and array come alive
    int sum = 0;
    for(int i = 0; i < length; i++)
    {
       sum = sum + array[i];  // now, this refers to outter sum, each time thru the loop
    }
    return (float)sum / length;  // the return value is saved somewhere, 
                                 // probably in a register. You need to
                                 // cast at least one operator in the
                                 // expression to do floating point math.
}   // outter sum, length, and array die

推荐阅读