解释程序的结果?

时间:2013-08-13 11:38:24

标签: 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;

}

请解释为什么会这样?

5 个答案:

答案 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)

以上代码表示:

  1. 在此之前,评估i<=5 && i>=-1(没有任何副作用,所以没有任何反应)
  2. 在每次迭代时,递增i,然后检查它是否为零。如果它不为零,则运行另一次迭代。
  3. 在每次迭代结束时,评估i>0(再次,什么都不做)。
  4. 因此,您的循环简化为并且基本上是

    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的,请阅读

What is 2's Complement Number?

答案 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只能通过溢出变为零。

你的第三个陈述并不重要,这是无关紧要的。