c - 为什么这里的“sum”变量每次迭代都没有更新?
问题描述
我用 C 编写了这个相当简单的代码来找出 5 个数字的平均值:-
int main()
{
int n,sum = 0;
for(int i = 0; i < 5; i++)
sum += scanf("%d", &n);
printf("avg =%d/n",(sum / 5));
return 0;
}
但是,它没有给我正确的输出。
因此,在检查了一些语句之后,我终于用这段代码得到了正确的输出:-
int main()
{
int n,sum = 0;
for(int i = 0; i < 5; i++)
{
scanf("%d", &n);
sum+=n;
}
printf("avg =%d\n", (sum / 5));
return 0;
}
唯一的区别是我没有像在第一种情况下那样通过将扫描的值添加到 sum 变量来直接更新总和。然后我在第一个代码的循环中添加了一个打印语句以查看发生了什么并找到不是存储输入的总和,而是存储在该实例中输入的值(例如,如果我在第一次迭代中输入 1,那么它会存储 1,然后当我输入 2 而不是存储 3 时,它会存储 2 ) 等等。
谁能解释为什么会这样?
解决方案
scanf("%d", &n)
将扫描后的值存储在格式字符串后面给出的指针指向的内存中,即存储在&n
哪个原因是变量所指向的内存中n
。
scanf
返回成功扫描的项目数。在您的情况下,当用户输入有效整数时,该值为 1。
因此,它n
必须添加到sum
. 不是应该添加的返回值。这就是为什么第二种解决方案是正确的。
顺便提一句
您应该始终检查返回的值,scanf
以确保您已扫描正确数量的项目。喜欢:
int main()
{
int n,sum = 0;
for(int i = 0; i < 5; i++)
{
if (scanf("%d", &n) != 1)
{
// Error - coud not read valid integer
// Add some error handling or simply stop the program using
exit(1);
}
sum+=n;
}
printf("avg =%d\n", (sum / 5));
return 0;
}
推荐阅读
- java - Java递归代码未返回预期结果
- cordova - 如何使用cordova在混合应用程序中本地保存数据?
- python-3.x - Python 3 - 在 x 轴上绘制小时数时,matplotlib 无法识别时区
- python - 尝试检查输入中的字符串是否在变量中时使用 Python 语法苦苦挣扎
- ios - 将 Flutter App 的 iOS 部分连接到 Firebase 的困惑
- objective-c - Xcode 中具有原子/同步属性和 NSLock 的线程清理程序问题
- youtube - YouTube API v3 搜索未返回所有视频
- haskell - the recursion of custom data type
- python - 如何使用 tweepy 获取按分钟索引的上周 Twitter 推文数据的数据框?
- unique-ptr - CPP 指南:重置智能指针