2013-02-28 46 views

回答

3

好消息:在您的实现,char签字!

此外,发生的是i的值从127溢出到-128,因为127是符合签名char的最大正值。

编辑:其实,我不知道的char在你执行的符号性,但循环完全打破:

这也许应该是

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

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

2

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

的原因,如果顺利从127到-128是因为如何有符号整数在电脑前工作。 127的二进制位是01111111,-128的位模式是1000000。向01111111添加一个将导致10000000

总而言之,你for循环是没有真正意义上的。它在语法上是正确的,但没有任何意义。为了说明如何for循环的作品看答案由Dan F.

14

那一定是我所见过的在我的生命中最畸形的for循环。对于循环被格式化为在for循环的开头如下

for (initalization; condition; update) 

,发生initialization。这通常是像i = 0。在每个循环的顶部,condition(通常像i < 5)为了看循环是否应该继续进行评估,并应循环继续,update执行(再次,通常像++i),并循环执行一次。

请告诉我这里发生,是循环使用++i作为条件,所以当++i计算结果为0值只会终止,于是你开始在1和增量,直到char i溢出从128-127,然后继续递增,直到它到达-1,在该点++i计算结果为0,循环终止

EDIT

因此,根据你的代码,i<=5 && i>=-1在循环的第一次迭代的最开始时执行(这完成完全没有),然后++i被评估为布尔状态(其为0开始,并且使用预增量评估是1,因此,而不是0所以布尔通过),然后执行i>0update部分,它再次不执行任何操作。

EDIT2

如果你的问题是真的,为什么它会1,2....128,-127,-126....-1然后勒夫提供了行为的一个很好的解释

+0

花时间来解释....不错1 – 2013-02-28 14:28:59

+0

哈,没有注意到。是的,这是一个非常糟糕的循环。 – 2013-02-28 14:30:25

+0

@WillihamTotland是这种情况吗? '我<=5 && i> = -1' – 2013-02-28 14:31:09

1

的程序解释“我”在打印时为8位有符号整数,意味着一位符号,七位数据。这给你一个范围-128到127的有效值。

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

1

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

无论如何。我初始化为0;第一个围绕for循环测试具有预增量的结束条件(++ i)。所以我增加到1,循环运行打印1.

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

最终我达到127;它然后增加到128,但你打印它为“%d”期待一个有符号的整数,所以使用二进制补码将其解释为-128。

增量然后一直延续到255(打印为-1)。下一个预增量会导致溢出,所以我再次变为0,此时“结束条件测试”计算结果为false,循环停止。

1

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

你做实际上:

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

溢出以上127你从1到127的数字和从-128到-1。