0

下面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;

}

请解释为什么会这样?

4

5 回答 5

0

它被称为溢出。类型“char”使用 1 个字节的 RAM 容量,因此它只能存储 256 个值。这些是 [-128, 127]。当您尝试超过 127 时,它将返回最低值。

除此之外,你的 for 循环有点混乱。尝试

for ( i = 0 ; i <= 5 ; ++i ) // This will print 0,1,2,3,4,5
    printf( "%d\n" , i );
于 2013-08-13T11:43:26.400 回答
0

因为这:

for(i<=5 && i>=-1 ; ++i;i>0)

结果为

1)初始化:

   i<=5 && i>=-1

什么也没做

2) 终止条件:

   ++i

递增 i 并在 i 变为零时终止

3) 每次循环执行的语句(通常是递增/递减):

   i > 0

什么也没做。

所以你的代码从 i = 0 循环到它再次为零

于 2013-08-13T11:44:14.637 回答
0

我猜你错误地使用了for循环。

for(i<=5 && i>=-1 ; ++i;i>0)

上面的代码意思是:

  1. 在任何事情之前,评估i<=5 && i>=-1(没有任何副作用,所以什么都没有发生)
  2. 在每次迭代中,递增i然后检查它是否为零。如果它不为零,则运行另一个迭代。
  3. 在每次迭代结束时,评估i>0(同样,什么也不做)。

因此,您的循环简化为并且本质上是

while (++i)

为了解释您的结果,您使用的系统可能使用将 char 实现为带符号的二进制补码整数,当它高于 127 时“包装”为负数(因为 8 位二进制补码整数中的 128 是 - 128)

于 2013-08-13T11:44:41.047 回答
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,请阅读

什么是 2 的补数?

于 2013-08-13T11:44:56.540 回答
0

这是您的代码的细分,它相当偷偷摸摸:

for( i <= 5 && i >= -1 ; ++i; i > 0)

通常,for 循环是(初始语句、表达式、第二条语句)。在第一个空语句之前查看您的代码:您所做的是一个表达式(代替语句),这根本不重要,但它完全没用。所以删除那行(这对这个表达式的结果没有影响)给我们:

for( ; ++i; i > 0)

...现在,如果您注意到您i在 for 循环之前初始化为 0。你接下来要做的是递增i然后返回它的值(见这里),因此它将从 1 ... -1 开始(在 127 处溢出)。这是因为在 C 中任何非零值都是true并且 0 是false。因此,一旦i变为 0,它将停止运行循环。i只能通过溢出变为零。

您的第三个陈述无关紧要,无关紧要。

于 2013-08-13T11:47:51.247 回答