鱼C论坛

 找回密码
 立即注册
查看: 1161|回复: 3

[已解决]新人求助!

[复制链接]
发表于 2023-6-4 21:18:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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;
}
sum=sum+num;和 status = scanf("%d", &num);交换顺序为什么不行捏? 还有就是sum+num时也没有说将输入的数赋值给num?
最佳答案
2023-6-4 21:19:07
交换"sum = sum + num;"和"status = scanf("%d", &num);"的顺序会导致输入的第一个数字没有被加到sum中,因为在循环的第一次迭代时,num的值还未被读入,因此sum也不能累加它。另外, "status = scanf("%d", &num);"是从标准输入中读入一个整数,然后将其存储到变量num中。因此,"sum = sum + num;"语句相当于将输入的当前数字累加到总和中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-4 21:19:07 | 显示全部楼层    本楼为最佳答案   
交换"sum = sum + num;"和"status = scanf("%d", &num);"的顺序会导致输入的第一个数字没有被加到sum中,因为在循环的第一次迭代时,num的值还未被读入,因此sum也不能累加它。另外, "status = scanf("%d", &num);"是从标准输入中读入一个整数,然后将其存储到变量num中。因此,"sum = sum + num;"语句相当于将输入的当前数字累加到总和中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 21:19:53 | 显示全部楼层
这是一个很好的问题,我先解释一下这段代码的基本逻辑:

这段代码的目的是从用户那里获取一系列整数,并将这些整数相加。 scanf("%d", &num)  这行代码的功能是从用户那里读取一个整数并将其赋值给  num 。然后, sum = sum + num  这行代码将  num  加到  sum  上。

do...while  循环的作用是:只要  scanf  成功读取一个整数,它就继续运行。如果  scanf  不能读取一个整数(例如,用户输入了非数字字符),它会返回一个非 1 的值,循环就会停止。

现在,对于你的问题:

1. 为什么  sum = sum + num;  和  status = scanf("%d", &num);  不能交换顺序?

   如果你交换了这两行代码,那么你将首先添加未初始化的  num  到  sum ,然后才从用户那里获取新的  num 。这意味着在第一次循环时,你将把一个未定义的值添加到  sum ,这可能导致程序行为异常。在  num  从用户那里获取值之后,再执行  sum = sum + num;  是更合适的。

2.  sum + num  时没有明确地说将输入的数赋值给  num ?

   这其实发生在  status = scanf("%d", &num);  这一行。 scanf  函数从用户那里获取输入,并将输入的整数赋值给  num 。然后, sum = sum + num;  这一行把  num  的值加到  sum  上。

希望这个解释能帮助你理解这段代码的工作原理。如果你还有其他问题,欢迎随时提问!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-4 21:20:04 | 显示全部楼层
在这段代码中,sum = sum + num; 的作用是计算已经输入数字的累加和,而 status = scanf("%d", &num); 的作用是读取下一个要累加的数字。这两行代码的先后顺序不能交换,否则会导致 sum 计算错误或者进入死循环。

如果将这两行代码的顺序交换,那么在输入第一个合法数字之前,num 没有被初始化,其值是不确定的。在 sum = sum + num; 这一行中,可能会导致 sum 的值被任意数加上,例如初始时 num 的值为负数,会抵消之后输入的正数,从而导致 sum 计算错误。

同时,scanf() 函数可以读取用户输入的数字,并将其赋值给变量 num。因此 sum = sum + num; 这一行代码在计算累加和时也就自动将输入的数字赋值给了 num,无需显式赋值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 10:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表