【问题标题】:Explain the result of the program?解释程序的结果?
【发布时间】:2013-08-13 11:38:23
【问题描述】:

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

}

请解释为什么会这样?

【问题讨论】:

  • char 是一个有符号的 8 位值。
  • 我认为您稍微混合了 for 循环的组件。
  • @Joe 它已在 OPs 编译器中签名,但并非必须如此。它是指定的实现。
  • 请将void 参数添加到main() 的定义中

标签: c output


【解决方案1】:

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

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

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

for( ; ++i; i > 0)

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

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

【讨论】:

    【解决方案2】:

    这叫做溢出。类型“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 );
    

    【讨论】:

      【解决方案3】:

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

      for(i&lt;=5 &amp;&amp; i&gt;=-1 ; ++i;i&gt;0)

      以上代码意思是:

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

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

      while (++i)

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

      【讨论】:

        【解决方案4】:

        首先,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?

        【讨论】:

          【解决方案5】:

          因为:

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

          结果

          1) 初始化:

             i<=5 && i>=-1
          

          什么都不做

          2) 终止条件:

             ++i
          

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

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

             i > 0
          

          什么都不做。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-06-13
            • 2017-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多