c - 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;
}
解决方案
sum
循环内部是该循环外部的阴影 sum
。您需要了解变量范围以了解为什么它不能按预期工作。当您输入一段代码(用花括号指定{ ... }
)时,您的自动变量(在大多数实现中存在于堆栈中的那些)会激活,而当您离开该代码块时会死亡。因此,当您进入average
函数时,您已声明sum
的局部变量 ( ) 和参数 ( length
and 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
推荐阅读
- ios - ios全屏背景图片
- javascript - 如何链接到Angular中同一页面上的锚点
- ios - UITableView,点击按钮自动调整单元格高度
- python - 如何检查另一个程序中的任务是否已完成?
- spring - Spring Boot:Spring 数据 jpa + Mariadb
- macos - 在 Mac 上安装 kubectl 时如何解决 localhost:8080 not found 问题?
- c - 如何在 makefile 中包含项目目录之外的标头
- google-cloud-platform - 我将 Java 代码放在 Google Cloud Tasks 的什么位置
- javascript - 未使用 JavaScript 建立 WebSocket 连接
- reactjs - 找不到模块:无法解决“react-bootstrap”问题