各位好,今天在学习C语言的循环结构后在做练习题,遇到了研究后还是不理解的代码,想请教一下这段代码的原理,具体内容如下:
题目:“你能看出下边代码会打印哪个范围内的所有数值呢?”
#include
int main()
{
signed char i = 0;
while (i <= 0)
{
printf("%d", i);
i = i - 1;
}
return 0;
}
我的答案:char数据类型长度为一个字节,而signed char的取值范围为 -128到127,所以会输出0到-127范围内的所有整数。
正确答案:会输出 0 到 128 范围内的所有整数。
我的疑问:我理解有符号的char数据类型的范围是-128到127,循环中的代码是不断递减i直至-127并输出对应数值,但是经过单步调试后发现这个循环到-128后,下一个循环变为127(到这一步我还理解),但再下一个循环之后程序就结束了,并且输出了0 ~ 128 范围内的所有整数,但是为什么会输出了0-128这个范围内的所有整数而不是0到-127范围内的所有整数呢?
还请指点迷津,谢谢!
请确认你的描述,你的描述确认是对的吗?
首先,你定义的signed char,是8个bits,也就是从-128 ~ 127
其次,你的变量 i 是从0 开始,while 循环也是从 <= 0 开始,那么,
第一个打印肯定是0.。。。。。。
第二个打印是0-1,所以,对于8个bits 的0,即二进制0000 0000,减去1之后,应该变量1111 1111,也就是-1
第三个打印是-1-1,二进制为1111 1111 减去1,也就是 1111 1110,也就是-2
依次类推,一直到1000 0000,也就是-128
当-128 也就是二进制的1000 0000,减去1 之后,二进制变为0111 1111,也就是127.。。。。。
再次进入while,127 <= 0 不成立,退出while 循环。。。。。
你这个程序的正确答应应该是:
0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72-73-74-75-76-77-78-79-80-81-82-83-84-85-86-87-88-89-90-91-92-93-94-95-96-97-98-99-100-101-102-103-104-105-106-107-108-109-110-111-112-113-114-115-116-117-118-119-120-121-122-123-124-125-126-127-128
也就是 -128 ~ 0,完全没问题。。。。也就是你需要表达的正确方向。。。。。
第一种 把while改成while(i<=1)即可,
因为你的输出在i=i-1的前面,当你输出-127时,实际上printf()下面的i又减了1,只不过不满足范围了就跳出了while语句,所以只能到-127。