鱼C论坛

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

[已解决]while语句

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

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

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

x
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         signed char i = 0;

  5.         while (i <= 0)
  6.         {
  7.                 printf("%d", i);
  8.                 i = i - 1;
  9.         }

  10.         return 0;
  11. }
复制代码


为什么会打印出0到-128?
最佳答案
2020-4-3 22:34:23
     signed char 的编码范围是 -128 ~ 127,-128 是 unsigned char 所能表达的最小值,如果继续减 1,将会发生溢出,同时,i 的值会变成 unsigned char 所能表达的最大值 127,于是, while (i <= 0) 的条件就不再成立,循环也就终止了。
     试试下面的代码就能看明白:
  1. #include <stdio.h>

  2. main()
  3. {
  4.         char c             ;
  5.         c = -128           ;
  6.         printf("%d\n" , c) ;
  7.         c --               ;
  8.         printf("%d\n" , c) ;
  9. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-3 22:27:56 | 显示全部楼层
因为signedchar范围是-128~127,i一直向下自减,到了-128之后,再减一就变成127了,那时就不符合循环条件了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-3 22:34:23 | 显示全部楼层    本楼为最佳答案   
     signed char 的编码范围是 -128 ~ 127,-128 是 unsigned char 所能表达的最小值,如果继续减 1,将会发生溢出,同时,i 的值会变成 unsigned char 所能表达的最大值 127,于是, while (i <= 0) 的条件就不再成立,循环也就终止了。
     试试下面的代码就能看明白:
  1. #include <stdio.h>

  2. main()
  3. {
  4.         char c             ;
  5.         c = -128           ;
  6.         printf("%d\n" , c) ;
  7.         c --               ;
  8.         printf("%d\n" , c) ;
  9. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-4-4 16:25:03 | 显示全部楼层
科普:
signed char取值范围是 -128 到 127(有符号位)
unsigned char 取值范围是 0 到 255
回答:
从0到-128都是满足条件的输出,是可以输出的,但是再减一就超出了signed char的可表示范围,就只能跳出循环啦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 10:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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