鱼C论坛

 找回密码
 立即注册
查看: 4383|回复: 11

while(-7--) 到最后结果为啥为0?

[复制链接]
发表于 2013-7-31 10:51:20 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 yefengya 于 2013-7-31 10:53 编辑
  1. void main()
  2. {

  3. int a = -7;

  4. while( a-- );

  5. printf("%d", a);

  6. }
复制代码

以上结果输出结果。a=-1;
一个负数自减,将会是一个无穷大的负数,原本以为是个死循环,最后溢出。可经调试咋个变量a就变成了0,结束了循环咧。请大侠指教一二哈。

最佳答案

查看完整内容

你程序我在电脑上运行结果是这样。。。 所以, 我觉得, 当小到下限时, 会变成上限的最大值。。。。 个人见解, 看下面: 如果为: 你那程序, while(a--);所以, a到达最小时, 变成最大, 从最大一直减小到a = 0, 之后退出while, 而a--, 是后减, 所以最后a = -1, 个人见解, 不知有没有错。。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 10:51:21 | 显示全部楼层
你程序我在电脑上运行结果是这样。。。
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int a = -7;
  5.         while( a-- )
  6.         {
  7.                 if(a == 32767)
  8.                         printf("%d\n", a);
  9.         }
  10.         printf("%d", a);
  11.         return 0;
  12. }
复制代码
1.png



所以, 我觉得, 当小到下限时, 会变成上限的最大值。。。。
个人见解, 看下面:

  1. #include <stdio.h>
  2. #include <limits.h>
  3. int main(int argc, char *argv[])
  4. {
  5.         short value;
  6.         printf("sizeof(short) = %d\n", sizeof(short));
  7.         printf("SHRT_MIN = %d\n", SHRT_MIN);
  8.         //-32768
  9.         //32768 -->二进制为: 1000 0000 0000 0000
  10.         //-32768 -->二进制为:1111 1111 1111 1111 +  1 = 1000 0000 0000 0000
  11.         // 1 -->二进制为: 0000 0000 0000 0001
  12.         //-1 -->二进制为: 1111 1111 1111 1110 + 1 = 1111 1111 1111 1111
  13.         //-32768 + (-1)
  14.         //  1000 0000 0000 0000
  15.         //+ 1111 1111 1111 1111
  16.         //= 0111 1111 1111 1111 -->进进制为:32767
  17.         printf("SHRT_MIN - 1 = %d\n", SHRT_MIN-1);
  18.         value = SHRT_MIN-1;
  19.         printf("short value = %d\n", value);
  20.         return 0;
  21. }
复制代码
如果为:

1.png


你那程序, while(a--);所以, a到达最小时, 变成最大, 从最大一直减小到a = 0, 之后退出while, 而a--, 是后减, 所以最后a = -1, 个人见解, 不知有没有错。。。。。。

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-31 10:58:58 | 显示全部楼层
敢情变量自减也会在取值范围内正负轮回,永不“溢出”啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 11:24:18 | 显示全部楼层
本帖最后由 喜欢散步 于 2013-7-31 12:12 编辑

最小那个int型数再减1的话, 就变成0了......你用计算器试一下....
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 11:44:27 | 显示全部楼层
在问问看到你的回答,忍不住解答下你的疑问。
感情你不理解'溢出'的含义?假如你所定义int是2字节的。
当a减少到-32768,也就是int型的最小值时,再自减的值就变为了32767而不是楼上说的0。
本来-32768减去1应该是-32769而现在是32767,这不是溢出吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 12:04:51 | 显示全部楼层
有符号数 溢出 未定义行为
代码是错误的 结果无法确定
你看到只是千千万万种可能性当中微不足道的一种而已
没价值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 14:41:51 | 显示全部楼层
楼下继续回答
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 14:56:52 | 显示全部楼层
哈哈,这个我知道是溢出,楼主可能还不理解a-- 和--a的区别,a--到0时,跳出循环后又再减了一,你用--a试试,就可以得到你的东西
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 19:42:08 | 显示全部楼层
应为会溢出啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2013-7-31 21:51:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-7-31 23:38:38 | 显示全部楼层

嗯,的确是在正负之间轮回,但是正负之间不是有一个中介:0 吗?!当到 a-- == 0 的时候,while 退出循环,执行 printf 语句,还记得吗?是 a-- 而不是 --a,所以欠下的总是要还的,a == 0,所以 a-- == -1,打印!嗯嗯,给分吧~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-31 23:49:44 | 显示全部楼层
呵呵,小甲鱼你的分够多的啦。我还是把分留给更需要它的6楼的那位虾友哈。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 20:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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