为何循环后的average=average/i代码不可达?初始代码曾正常运行
嘿,我来帮你搞明白这个「代码不可达」的问题~
问题根源
你遇到的问题核心,是那个没有终止条件的无限for循环:
for( i=0; ; i++) { average=average + testScores[i]; }
在C语言里,for循环的结构是for(初始化; 循环条件; 增量),如果中间的循环条件留空,就表示这个循环永远不会停下来——它会一直重复执行循环体里的代码,永远不会跳出。这样一来,循环后面的average= average/i;以及所有后续的等级判断、return语句,根本没机会被执行到,所以编译器就会提示这行代码「不可达」。
而且这里还有个隐藏的大坑:无限循环会让i不断增大,早晚会超出testScores数组的下标范围,导致数组越界访问,程序运行时很可能直接崩溃,或者出现各种奇怪的错误。
修复方法
你需要给循环加上合理的终止条件,比如你肯定知道testScores数组里有多少个分数吧?假设分数的数量是scoreCount,那循环可以改成这样:
char calculate(){ int i, average=0; int scoreCount = 5; // 这里替换成你实际的分数数量哦 for( i=0; i < scoreCount; i++) { average = average + testScores[i]; } average = average / i; char grade='A'; if(average>=90 && average<=100) grade='O'; else if(average>=80 && average<90) grade='A'; else if(average>=70 && average<80) grade='B'; else if(average>=55 && average<70) grade='C'; else if(average>=40 && average<55) grade='D'; else if(average<40) grade='T'; return grade; }
如果你的分数列表是用「哨兵值」(比如用-1表示分数结束)来标记的,那换成while循环会更灵活:
char calculate(){ int i=0, average=0; while(testScores[i] != -1) { // 假设-1是分数结束的标记 average += testScores[i]; i++; } // 别忘了处理没有分数的情况,避免除以0的错误! if(i == 0) { return 'E'; // 这里可以换成你需要的默认等级或错误标记 } average = average / i; char grade='A'; if(average>=90 && average<=100) grade='O'; else if(average>=80 && average<90) grade='A'; else if(average>=70 && average<80) grade='B'; else if(average>=55 && average<70) grade='C'; else if(average>=40 && average<55) grade='D'; else if(average<40) grade='T'; return grade; }
另外提醒一句:如果没有任何分数被累加(i=0),那average/i会触发除以0的运行时错误,所以一定要加上判断处理这种边界情况哦。
内容的提问来源于stack exchange,提问作者Pragya Kulshresth
相关产品推荐
相关产品推荐

