1

在下面的程序中

#include<stdio.h>   
int main()    
{    
    char i=0;    
    for(i<=5 && i>=-1;++i;i>0)   
        printf("%d\t",i);
    return 0;    
}    

'i' 从 1 打印到 127,然后从 -128 打印到 -1。

为什么会这样?

4

7 回答 7

14

这一定是我一生中见过的最畸形的 for 循环。for 循环的格式如下

for ( initalization; condition; update )

for循环的开始,initialization发生。这通常类似于i = 0. 在每个循环的顶部,condition(通常类似于i < 5)被评估以查看循环是否应该继续,如果循环继续,update则执行(再次,通常类似于++i),并且循环再次执行。

这里发生的事情是循环++i用作条件,所以它只会在++i计算为一个0值时终止,所以你从开始1并递增直到从tochar i溢出,然后继续递增直到它达到,此时评估为和循环终止128-127-1++i0

编辑

因此,根据您的代码,i<=5 && i>=-1在循环的第一次迭代的最开始执行(这完全没有完成任何事情),然后++i评估布尔状态(0开始,并使用预增量,评估是1,因此,而不是0布尔值通过),然后执行update部分i>0,它再次什么也不做。

编辑2

如果你的问题真的是关于为什么会这样,1,2....128,-127,-126....-1那么 Joachim 对这种行为提供了一个很好的解释

于 2013-02-28T14:28:25.580 回答
3

好消息:在您的实施中,char已签署!

此外,发生的情况是i从 127 溢出到 -128 的值,因为 127 是适合带符号的最大正值char

编辑:实际上,我不确定char您的实现中的签名,但是循环完全被破坏了:

应该是

for (i = 0; i <= 5; i++)

但这只是一个猜测。很难解释。

于 2013-02-28T14:25:42.610 回答
2

您可能想阅读有关二进制补码表示的信息

于 2013-02-28T14:28:23.723 回答
2

Achar是编译器中的有符号 8 位整数。它可以表示从 -128 到 +127 的值。循环结束条件是++i,并且在 C 中所有非零值都被认为是真的,所以它将循环直到++i为零,这将在iis时发生-1

if 从 127 变为 -128 的原因是有符号整数在计算机中的工作方式。127 的二进制位是01111111,-128 的位模式是1000000。加一01111111将导致10000000.

总而言之,你的for循环没有真正的意义。它在语法上是正确的,但没有任何意义。有关 for 循环如何工作的解释,请参阅 Dan F 的答案。

于 2013-02-28T14:27:08.227 回答
1

顺便说一句,那个 for 循环太可怕了。你知道它应该是for(intialisation; end condition; increment),对吧?

反正。i 初始化为 0;for 循环的第一个循环是测试具有预增量的结束条件 (++i)。所以我递增到 1,循环运行以打印 1。

现在重复。每个循环都会为 i 打印一个更高的值,因为结束条件测试是预先增加 i 的。

最终我达到了 127;然后它递增到 128,但您将其打印为“%d”,它需要一个有符号整数,因此使用二进制补码将其解释为 -128。

然后增量一直持续到 255(打印为 -1)。下一个预增量导致溢出,因此 i 再次变为 0,此时“结束条件测试”评估为 false 并且循环停止。

于 2013-02-28T14:30:35.547 回答
1

这个程序有很奇怪的用于循环。您通过检查它们“i<=5 && i>=-1”来初始化循环变量 - 没有完成分配。在循环期间,您评估条件“++i”,直到 i = -1; 在增量步骤中,您只需检查数字是否大于零。

你实际上是这样做的:

for(i = 1; i != 0; i++)
{
    printf("%d\t",i);
}

溢出高于 127 时,您会得到从 1 到 127 以及从 -128 到 -1 的数字。

于 2013-02-28T14:31:34.727 回答
1

程序在打印时将“i”解释为一个 8 位有符号整数,即 1 位用于符号,7 位用于数据。这为您提供了 -128 到 127 的有效值范围。

“for”循环在 printf 之前预先递增i,因此给它一个第一次传递值 1,并且递增一直持续到 i+1=128 - 它翻转有符号整数中的符号位,然后运行循环直到 ++ i 导致 i 为 0。

于 2013-02-28T14:28:47.623 回答