以下是有问题的代码:
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;
}
这段代码对我来说似乎很正常,但是当我在该函数中包含该循环时,它具有以下输出:
从事物的角度来看,当循环退出时,编译器会向后退(如果这甚至可能?)并通过循环PLUS将print语句放在它之前一段时间。这种事怎么发生呢?我有什么明显的遗漏吗?或者这个错误更加狡猾吗?
答案 0 :(得分:2)
如果根据您的问题 title ,您的问题是why
被打印两次以上的原因,这很容易。 for
循环 仅在您发布的代码中运行两次,这可以通过它在输出中的每个集合之间输出一个整数来证明。
由于该整数可能是(未初始化的)i
变量的打印,因此最可能的解释是您不止一次调用getStats()
(可能在循环中)。
但是,根据您的评论:
从外观上看,当循环退出时,编译器会向后退(如果可能的话?)并循环播放PLUS前面的print语句一定次数。
可能是您的问题是为什么它似乎以相反的顺序打印(两个why
行然后是数字)。
这是窗口中回滚缓冲区的假象。如果你在缓冲区中有一个额外的行,你肯定会看到你目前理解的第一行之上的另一个整数。我建议查看输出的 end ,你肯定会看到两个why
而不是一个整数。