首页 > 解决方案 > 为什么这里的“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 ) 等等。

谁能解释为什么会这样?

标签: cvariablessyntaxscanf

解决方案


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;
}

推荐阅读