【问题标题】:Why do I not have to return "average" each time before proceeding to run through the loop again?为什么我不必每次都返回“平均”,然后再继续运行循环?
【发布时间】:2020-01-06 23:03:27
【问题描述】:

我正在学习 C,目前正在研究多维数组,但我不明白为什么在使用 new 平均值再次执行循环之前不需要返回“平均值”的值这是通过每次迭代完成的。

#include <stdio.h>

int main() {
    int grades[2][5];
    float average;
    int i;
    int j;

    grades[0][0] = 80;
    grades[0][1] = 70;
    grades[0][2] = 65;
    grades[0][3] = 89;
    grades[0][4] = 90;

    grades[1][0] = 85;
    grades[1][1] = 80;
    grades[1][2] = 80;
    grades[1][3] = 82;
    grades[1][4] = 87;

    for (i = 0; i < 2; i++) {
        average = 0;

        for (j = 0; j < 5; j++) {
            average += grades[i][j];
        }

        average /= 5.0;
        printf("The average marks obtained in subject %d is: %.2f\n", i, average);
    }

    return 0;
}

在第二个 for 循环中,它首先使用我理解的 average = 0,但随着迭代的进行,average 开始增加(0+80、80 + 70、150 + 65 等。 .),为什么我不需要返回这个新的平均值以及程序如何知道在下一次循环时使用这个 new 平均值?

为什么每次迭代不只是继续使用average = 0

【问题讨论】:

  • 没有“新”变量average。在外部 for 循环中,您只需重用相同的变量 average

标签: c arrays multidimensional-array return


【解决方案1】:

我相信你可能把你的循环搞混了。看到第一个循环,(for i) 先设置average = 0,然后执行第二个循环。

第二个循环(for j)将几个值添加到平均值中,而不关心起始值是什么;正在就地编辑平均值。 (average += 意味着去寻找普通人的生活并改变它)。

for (i = 0; i < 2; i++) {
|        average = 0;
|
|        for (j = 0; j < 5; j++) {
|        |    average += grades[i][j];
|        |  }
|
|        average /= 5.0;
|        printf("The average marks obtained in subject %d is: %.2f\n", i, average);
|    }

第二个循环不关心之前的平均值,也不关心它是否在第一个循环内。它可以帮助您在调试器中跟踪代码单步执行。

也许注意到“平均”在 main 开始时被声明的方式会有所帮助。在其他语言中average = 0 可以声明一个变量average,但在C 中不能。我们需要'float' 或其他类型来声明一个新变量。您的代码中所有提到的平均值都指的是同一个对象 - 在 main 开头声明的平均值。

【讨论】:

  • 这可能是我把事情搞混了,我正在阅读“平均值 = 0”作为声明一个名为平均值的变量,而不是设置平均值的起点以在循环内开始 (.. .对吗?),就像你说的。我对C不是很熟悉,但我过去使用过它,所以我可能只是让事情变得复杂,因为它已经有一段时间了。我也知道平均值随后被编辑到位,但是平均值的新值是如何/在哪里被“保存”以作为下一次迭代的新起始值的?
  • average = 0 没有声明变量。它只是将0 放入已在此处声明的变量中:float average;
  • @Jabberwocky 说得对,在 C 中,声明以类型开头:float average;。在您的示例中,其他提到的 average 都指的是同一个变量。
【解决方案2】:

此外,外部for 将每次迭代中的平均值再次设置为 0,但内部for 迭代数组的一个“行”,直到它再次跳出外部循环。 正如Evan Benn 所建议的那样,您应该逐步检查执行。

您或多或少会看到这些值存储在average

//startup skipped
entering outer for i=0
    average = 0
        entering inner for j=0
              average = 0 + 80
        j = 1
              average = 80 + 70
        ... j = 2,3,4
              average = 150 + 85 + 89 + 90
        exiting inner loop, average is now
        average = 414
now code enters the outer for loop with i = 1
      average = 0 <-- here the outer for loop is resetting the value to 0 again

【讨论】:

  • 谢谢大家的帮助,我现在明白了。我肯定对某些事情读得太远了,只是为了使它们复杂化,但现在它是有道理的。
  • 酷,请记得将问题标记为已回答,以便其他用户也可以获利:-)
  • 嘿抱歉!我试图在我的计算机上将其标记为已回答,但它不会将复选标记更改为绿色,所以我不知道它是否已经通过。不过,我只是在手机上完成的,所以希望它能正常工作:)
猜你喜欢
  • 2023-01-07
  • 2017-05-01
  • 2017-08-19
  • 2019-04-15
  • 2022-09-30
  • 2015-03-16
  • 2020-07-09
  • 2017-11-21
  • 1970-01-01
相关资源
最近更新 更多