新手课后作业求助
请教一下这个代码错在那里了,为啥它会多算一次我输入的值呢,而且我发现把b=scanf和sum=a +sum那段代码换个位置,就能正常编译,这是为什么输入A的时候scanf读取失败,没有对a进行赋值,但是a在上一次循环已经被赋值为4了,所以后面sum=sum+a的时候相当于4+4了,看起来就像是加了两次值 本帖最后由 myd0311 于 2023-4-1 16:13 编辑
一个有效的改法:
#include <stdio.h>
int main() {
double a = 0, sum = 0;
int b = 1;
do {
sum += a;
printf("输入一个数字:");
b = scanf("%lf", &a);
} while (b == 1);
printf("结果是:%lf", sum);
return 0;
}
A 不是数字,所以读入失败,返回 -1,但 scanf 没有操作 a 的值,a 还是原来的 a,也就是 4,所以,你应该先判断,再 sum += a 代码未调换顺序前:
第一次执行do语句:
4(a) + 0(sum) = 4(sum)
因为输入的数字是4,b的值等于1;
故再一次执行do语句:
(A不是数字,故a仍等于4,但现在b等于-1)
4(a) + 4(sum) = 8(sum);
b等于-1,跳出循环,最终sum等于8。
代码调换顺序后:
第一次执行do语句:
0(a) + 0(sum) = 0(sum)
接着a才被赋值为4;
b值为1,第二次执行do语句:
4(a) + 0(sum) = 4(sum)
接着a被赋值为A(不合法数字),故b值为-1,循环结束,sum值为4
都是两次执行do语句,只是调换代码顺序前是先给a赋值再求和,调换代码顺序后就变成了先求和再给a赋值
(本人水平暂低,有可能理解错了)
页:
[1]