鱼C论坛

 找回密码
 立即注册
查看: 1341|回复: 14

[已解决]新手的for语句

[复制链接]
发表于 2020-10-25 10:09:25 | 显示全部楼层 |阅读模式

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

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

x
是什么条件让程序结束的 判断的结果不是 i>0 吗?
最佳答案
2020-10-25 11:41:28
阿九。 发表于 2020-10-25 11:27
整数除以整数怎会为负数啊 (i < 0),还是说我理解错了?

最后一位的精度丢失之后 i 就等于0了,  比如double只能存储小数点后10位的数字,i = 0.0000000001再除以10, 就会把最后一位的 1 丢掉了,这个时候 i = 0 ,没说小于0.  你把double换成float,应该是150次左右
截屏2020-10-25 10.07.38.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-25 10:27:03 | 显示全部楼层
1078 次

帖子.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-25 10:47:25 | 显示全部楼层
你的程序有问题,由于不是你问题所在“ 循环多少次 ”,我在上面的回复中就没有改了
问题1:作为循环变量,应该是整型,而不是双精度 double 型
问题2:既然是 double 型,输出语句中就不能使用浮点数输出,而要使用双精度 double 型 %.2lf (大写字母L的小写字母)

正确的程序如下:


  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int count = 0;
  5.     int i;
  6.     double vol;
  7.     for (i = 10;i > 0;i /= 2)
  8.     {
  9.         vol = i;
  10.         printf("%.2lf\n", vol);
  11.         count += 1;
  12.     }
  13.     printf("%d",count);
  14. }
复制代码


这个程序执行4次,输出:
10.00
5.00
2.00
1.00
4
-------------------------------------------
Process exited after 0.2226 seconds with return value 1
请按任意健继续 。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-25 10:55:31 | 显示全部楼层
如果不像3楼说的题目没错的话
这个和double的精度有关,你把i=1就是1075次, 2的1075次幂是4.0480450661462123670499069343783e323, 也就是说这个for循环已经算到小数点后323位已经都是0了,  如果你的系统double类型能存储到小数点后324位,前面这个数再除以2,就只能把最后一个不是0的数字再向后移一位(我只是打个比方, 计算机存储数据都是二进制形式), 但实际上已经超出double类型的范围, 向后移的那个数字就会被忽视掉了,这个时候i就等于0 了, 这种情况叫下溢.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-10-25 11:14:51 | 显示全部楼层
风过无痕1989 发表于 2020-10-25 10:47
你的程序有问题,由于不是你问题所在“ 循环多少次 ”,我在上面的回复中就没有改了
问题1:作为循环变量 ...

循环多少次是小甲鱼抛出的问题
我主要是想知道是什么条件使程序终止的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 11:18:59 | 显示全部楼层
阿九。 发表于 2020-10-25 11:14
循环多少次是小甲鱼抛出的问题
我主要是想知道是什么条件使程序终止的?

终止的条件就是 i > 0,i 每次的步进是0.5,从10开始,你有兴趣可以算一算,1078 次以后,i 等于多少呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-25 11:25:15 | 显示全部楼层
jitianmoshen 发表于 2020-10-25 10:55
如果不像3楼说的题目没错的话
这个和double的精度有关,你把i=1就是1075次, 2的1075次幂是4.0480 ...

无论是什么溢,程序运行是骗不了人的,我的系统是32位,运行1078次终止。如果你的系统是64位或更高,你可以运行试试看,运行了多少次程序终止
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-10-25 11:27:33 | 显示全部楼层
风过无痕1989 发表于 2020-10-25 11:18
终止的条件就是 i > 0,i 每次的步进是0.5,从10开始,你有兴趣可以算一算,1078 次以后,i 等于多少呀

整数除以整数怎会为负数啊 (i < 0),还是说我理解错了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 11:41:28 | 显示全部楼层    本楼为最佳答案   
阿九。 发表于 2020-10-25 11:27
整数除以整数怎会为负数啊 (i < 0),还是说我理解错了?

最后一位的精度丢失之后 i 就等于0了,  比如double只能存储小数点后10位的数字,i = 0.0000000001再除以10, 就会把最后一位的 1 丢掉了,这个时候 i = 0 ,没说小于0.  你把double换成float,应该是150次左右
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-25 11:50:03 | 显示全部楼层
风过无痕1989 发表于 2020-10-25 11:25
无论是什么溢,程序运行是骗不了人的,我的系统是32位,运行1078次终止。如果你的系统是64位或更高,你可 ...

他问的不是具体多少次, 是为什么程序停止
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-25 12:01:54 | 显示全部楼层
jitianmoshen 发表于 2020-10-25 11:50
他问的不是具体多少次, 是为什么程序停止

不是告诉他运行了1078次吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 12:03:42 | 显示全部楼层
阿九。 发表于 2020-10-25 11:27
整数除以整数怎会为负数啊 (i < 0),还是说我理解错了?

i 是不会小0的,但系统是有限的,超过了砐限,肯定就不能运行下去了,就会终止程序了的呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 12:04:38 | 显示全部楼层
执行1078次之后,i的值太小,计算机就默认成0,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-25 13:06:55 | 显示全部楼层
阿九。 发表于 2020-10-25 11:27
整数除以整数怎会为负数啊 (i < 0),还是说我理解错了?

以下是本求助帖子的原程序,我只是加了一个统计而已。大家都可以运行一下试试,看看结果如何

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int count = 0;             // 为了统计,增加一个计数器
  5.     double i;
  6.     for (i = 10;i > 0;i /= 2)
  7.     {
  8.         printf("%.2f\n", i);  // 此处的错误没有修改,正确的应该是 %.2lf
  9.         count += 1;
  10.     }
  11.     printf("%d",count);    // 输出统计结果
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-27 09:45:19 | 显示全部楼层
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         double i;
  5.         int count = 0;
  6.         for (i = 10;i > 0;i /= 2)
  7.         {
  8.                 printf("%0.2f\n", i);
  9.                 count += 1;
  10.                
  11.         }
  12.         printf("%d\n", count);
  13.         return 0;
  14. }
  15. //结果是1078次
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-15 08:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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