huiwenwu 发表于 2017-7-13 01:13:51

求助:《带你学C带你飞》S1E14 动动手第1题

小甲鱼老师的,《带你学C带你飞》S1E14 动动手第1题,题目是:

写一个程序,对用户输入的整数进行求和。当用户输入任意字符时,结束程序并打印结果。

小甲鱼的标准答案如下。我有两点想不太通的:
1. 为什么num要先付值为0(int num=0)?只int num;然后通过下面的scanf函数再得到值不行吗?
2. 为什么sum = sum + num 语句要在status=scanf("%d", &num)之前?而不是printf()后接scanf()再接sum=sum+num?

(实际上是必须要这样写代码才能正确执行。我有点想不过来。。。基础还不行。。。。。{:5_99:} )


#include <stdio.h>

int main()
{
      int num = 0;
      long sum = 0L; // 0L表示类型为long的0
      int status;

      do
      {
                printf("请输入合法的数字:");
                sum = sum + num;
                status = scanf("%d", &num);
      } while(status == 1);

      printf("结果是:%ld\n", sum);

      return 0;
}

ba21 发表于 2017-7-13 10:25:17

huiwenwu 发表于 2017-7-13 13:11:08

ba21 发表于 2017-7-13 10:25


非常感谢!终于搞明白了!我不是计算机专业,之前学的python,刚开始学c,感觉c比python难好多啊!!

但关于第2点。sum=sum+num要放在前面的原因,是因为在scanf()函数中输入错误类型时,里面的附加参数(这个例子子是num)还是会保留上一次成功输入返回的值(比如你图中的3),所以会再加一次到sum中。 而跟scanf()函数本身的返回值关系不大吧。实际上当输入错误时这里scanf的返回值是0,因为只有一个附加参数num.

ba21 发表于 2017-7-13 14:03:26

huiwenwu 发表于 2017-7-13 13:11
非常感谢!终于搞明白了!我不是计算机专业,之前学的python,刚开始学c,感觉c比python难好多啊!!

...

是的。返回成功的个数,不就是返回之前成功的值吗?

huiwenwu 发表于 2017-7-13 14:25:03

ba21 发表于 2017-7-13 14:03
是的。返回成功的个数,不就是返回之前成功的值吗?

不是啊,我理解的“成功的个数”是指scanf()函数的返回值,在这个例子中,由于只有一个附加参数,所以只要输入错误,返回值就是0;
而“返回之前成功的值”是scanf函数里面的附加参数(这个例子是num),返回上一次成功的值,比如上次的输入是数字9,则这次就算字母a,num还是会返回9.

ba21 发表于 2017-7-13 20:05:18

huiwenwu 发表于 2017-7-13 14:25
不是啊,我理解的“成功的个数”是指scanf()函数的返回值,在这个例子中,由于只有一个附加参数,所以只 ...

scanf的返回值是返回值,成功返回1,失败返回0。
失败的话num保留上次成功时存入的数据。
页: [1]
查看完整版本: 求助:《带你学C带你飞》S1E14 动动手第1题