C 解释程序的结果?
以下c程序的输出为, 输出:1,2,3,4。。。。。。。。126,127,-128,-127 .... -2,-1 ?C 解释程序的结果?,c,output,C,Output,以下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; #包括 #包括
#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;
#包括
#包括
int main()
{
字符i=0;
对于(i=-1;++i;i>0)
printf(“%d\n”,i);
printf(“\n”);
返回0;
}
请解释为什么会这样?它被称为溢出。类型“char”使用RAM容量的1字节,因此它只能存储256个值。这些是[-128127]。当你试图超过127时,它将返回最低值 除此之外,您的for循环有点混乱。试一试
for ( i = 0 ; i <= 5 ; ++i ) // This will print 0,1,2,3,4,5
printf( "%d\n" , i );
for(i=0;i因为:
for(i<=5 && i>=-1 ; ++i;i>0)
递增i,当i为零时终止
3) 每次循环执行的语句(通常为递增/递减):
什么也不做
因此,您的代码从i=0开始循环,直到它再次为零。我猜您使用for循环的方式不正确
for(i=-1;++i;i>0)
上述代码意味着:
在做任何事情之前,先评估i=-1
(这不会有任何副作用,所以不会发生任何事情)
在每次迭代中,递增i
,然后检查它是否为零。如果它不是零,则运行另一个迭代
在每次迭代结束时,计算i>0
(同样,它什么也不做)
因此,您的循环简化为
while(++i)
为了解释您的结果,您正在使用的系统很可能将字符实现为带符号整数,当字符大于127时,它将“包装”为负数(因为8位2的补码整数中的128是-128)首先,字符占用1个字节,并且是带符号的。
借助8位(1字节)的帮助,您可以表示的数字范围是
**-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**
在您的代码中,您正在递增i,并打印相同的值。
一旦我达到127(二进制011111=127),你再次增加它成为(10000000),也就是-128
打印时使用的是%d。所以输出将是整数格式。
这就是为什么它要打印1,2,3-128,-127
如果您不明白1000 0000是-128,请阅读
这是您的代码分解,它相当狡猾:
for( i <= 5 && i >= -1 ; ++i; i > 0)
。。。现在,如果您注意到在for循环之前已将i
初始化为0。接下来要做的是递增i
,然后返回它的值(请参阅),因此它将从1-1(在127处溢出)。这是因为在C中,任何非零值都是true
,0是false
。因此,一旦i
变为0,它将停止运行循环<代码>i
只能通过溢出变为零
您的第三条语句无关紧要,它是不相关的。
char
是一个有符号的8位值。我认为您稍微混合了for循环的组件。@Joe它是在OPs编译器中签名的,但不必这样。它是指定的实现。请将void
参数添加到main()
i > 0
**-(2^(8-1)) to +((2^(8-1)) -1) [ie from -128 to +127].**
for( i <= 5 && i >= -1 ; ++i; i > 0)
for( ; ++i; i > 0)