因为C中的循环循环次数比应该循环的次数多。为什么?

时间:2015-12-10 04:22:38

标签: c debugging

以下是有问题的代码:

int i, y, total = 0;

printf("%d\n", i);

for (i=0;i<2;i++) {
    printf("why\n");
}

它包含的功能:

void getStats(int month, const struct DailyData yearData[], int sz, struct MonthlyStatistic* monthly){

    // based off monthly stats, function finds min and max temp (float), average temp and the total precipitation

    int i, y, total = 0;

    printf("%d\n", i);

    for (i=0;i<2;i++) {
        printf("why\n");
        //printf("\n%d %d %d ", yearData[i].month, yearData[i].day, yearData[i].year);
        //draw(symbolToDraw(yearData[i].condition, aver),20);

    }

    float max = 0, min = 0, averaged = 0, prec = 0;

    //counts number of days in month

    for (y = 0; y < 366; y++) {
        if (yearData[y].month == month) {
            total++;
        }
    }

    //loop through year, assign data to variables if given row's month matches int month parameter

    for (i=1;i<=365;i++) {
        if (yearData[i].month == month) {
            if (yearData[i].high > max) {
                max = yearData[i].high;
            }
            if (yearData[i].low < min) {
                min = yearData[i].low;
            }
            //printf("high: %f, low: %f\n", yearData[i].high, yearData[i].low);
            averaged = average(yearData[i].high, yearData[i].low);
            prec += yearData[i].precipitation;

        }
    }


    monthly[month].averageTemperature = averaged;
    monthly[month].maxTemperature = max;
    monthly[month].minTemperature = min;
    monthly[month].totalPrecipitation = prec;

    return;

}

这段代码对我来说似乎很正常,但是当我在该函数中包含该循环时,它具有以下输出:

wtf

从事物的角度来看,当循环退出时,编译器会向后退(如果这甚至可能?)并通过循环PLUS将print语句放在它之前一段时间。这种事怎么发生呢?我有什么明显的遗漏吗?或者这个错误更加狡猾吗?

1 个答案:

答案 0 :(得分:2)

如果根据您的问题 title ,您的问题是why被打印两次以上的原因,这很容易。 for循环 仅在您发布的代码中运行两次,这可以通过它在输出中的每个集合之间输出一个整数来证明。

由于该整数可能是(未初始化的)i变量的打印,因此最可能的解释是您不止一次调用getStats()(可能在循环中)。

但是,根据您的评论:

  

从外观上看,当循环退出时,编译器会向后退(如果可能的话?)并循环播放PLUS前面的print语句一定次数。

可能是您的问题是为什么它似乎以相反的顺序打印(两个why行然后是数字)。

这是窗口中回滚缓冲区的假象。如果你在缓冲区中有一个额外的行,你肯定会看到你目前理解的第一行之上的另一个整数。我建议查看输出的 end ,你肯定会看到两个why而不是一个整数。