以下c程序的输出是, 输出:1,2,3,4 ........ 126,127,-128,-127 ...... -2,-1?
#include <stdio.h>
#include <string.h>
int main()
{
char i=0;
for(i<=5 && i>=-1 ; ++i;i>0)
printf("%d\n",i);
printf("\n");
return 0;
}
请解释为什么会这样?
答案 0 :(得分:0)
它被称为溢出。类型“char”使用RAM容量的1个字节,因此它只能存储256个值。这些是[-128,127]。当你试图超过127时,它将返回最低值。
除此之外,你的for循环有点搞砸了。尝试
for ( i = 0 ; i <= 5 ; ++i ) // This will print 0,1,2,3,4,5
printf( "%d\n" , i );
答案 1 :(得分:0)
因为:
for(i<=5 && i>=-1 ; ++i;i>0)
作为
1)初始化:
i<=5 && i>=-1
什么都不做
2)终止条件:
++i
递增i并在我达到零时终止
3)每次循环执行语句(通常是递增/递减):
i > 0
什么也没做。
所以你的代码从i = 0循环回到它再次为零
答案 2 :(得分:0)
我猜你正在错误地使用for循环。
for(i<=5 && i>=-1 ; ++i;i>0)
以上代码表示:
i<=5 && i>=-1
(没有任何副作用,所以没有任何反应)i
,然后检查它是否为零。如果它不为零,则运行另一次迭代。i>0
(再次,什么都不做)。因此,您的循环简化为并且基本上是
while (++i)
为了解释你的结果,你正在使用的系统很可能使用一个char作为一个带符号的two's complement整数,当它高于127时,它会'包装'到负数(因为8位是128)二进制补码整数是-128)
答案 3 :(得分:0)
首先,char占用1个字节并进行签名。 在8位(1字节)的帮助下,您可以表示的数字范围是
**-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**
在您的代码中,您正在递增i并打印相同的内容。 一旦我达到127(二进制0111 1111 = 127)并再次增加它变为(1000 0000),即-128。
打印时你正在使用%d。所以out将采用整数格式。 这就是它打印1,2,3 ... -128,-127 ......
的原因如果您不明白1000 0000是如何-128的,请阅读
答案 4 :(得分:0)
以下是您的代码细分,相当狡猾:
for( i <= 5 && i >= -1 ; ++i; i > 0)
通常for循环是,(初始语句,表达式,第二个语句)。在第一个null语句之前查看你的代码:你所做的是一个表达式(代替一个语句),这根本不重要,但它完全没用。因此删除该行(这对该表达式的结果没有影响)给出了:
for( ; ++i; i > 0)
...现在,如果您注意到在for循环之前将i
初始化为0。接下来你要做的是递增i
然后返回它的值(见here),因此它将从1 ... -1(溢出到127)开始。这是因为在C中,任何非零值都是true
,0是false
。因此,一旦i
变为0,它将停止运行循环。 i
只能通过溢出变为零。
你的第三个陈述并不重要,这是无关紧要的。