在下面的程序我不明白这个程序是如何工作的
#include<stdio.h>
int main()
{
char i=0;
for(i<=5 && i>=-1;++i;i>0)
printf("%d\t",i);
return 0;
}
“我”得到了从1到127,然后打印从-128到-1。
为什么会出现这种情况?
在下面的程序我不明白这个程序是如何工作的
#include<stdio.h>
int main()
{
char i=0;
for(i<=5 && i>=-1;++i;i>0)
printf("%d\t",i);
return 0;
}
“我”得到了从1到127,然后打印从-128到-1。
为什么会出现这种情况?
好消息:在您的实现,char
签字!
此外,发生的是i
的值从127溢出到-128,因为127是符合签名char
的最大正值。
编辑:其实,我不知道的char
在你执行的符号性,但循环完全打破:
这也许应该是
for (i = 0; i <= 5; i++)
但是这只是一个猜测。这很难解释。
一个char
是在你的编译器有符号的8位整数。它可以表示-128到+127的值。循环结束条件为++i
,并在C中的所有非零值被认为是真实的,所以它会循环直到++i
为零时i
是-1
这会发生。
的原因,如果顺利从127到-128是因为如何有符号整数在电脑前工作。 127的二进制位是01111111
,-128的位模式是1000000
。向01111111
添加一个将导致10000000
。
总而言之,你for
循环是没有真正意义上的。它在语法上是正确的,但没有任何意义。为了说明如何for循环的作品看答案由Dan F.
那一定是我所见过的在我的生命中最畸形的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>0
的update
部分,它再次不执行任何操作。
EDIT2
如果你的问题是真的,为什么它会1,2....128,-127,-126....-1
然后勒夫提供了行为的一个很好的解释
花时间来解释....不错1 – 2013-02-28 14:28:59
哈,没有注意到。是的,这是一个非常糟糕的循环。 – 2013-02-28 14:30:25
@WillihamTotland是这种情况吗? '我<=5 && i> = -1' – 2013-02-28 14:31:09
的程序解释“我”在打印时为8位有符号整数,意味着一位符号,七位数据。这给你一个范围-128到127的有效值。
“for”循环preincrements i在printf之前,因此给它的第一遍值为1,并且递增一直持续到i + 1 = 128 - 它将符号位翻转为有符号整数,然后运行循环直到++我导致i为0.
顺便说一下,for循环是可怕的。你知道它应该是for(intialisation; end condition; increment)
,对吧?
无论如何。我初始化为0;第一个围绕for循环测试具有预增量的结束条件(++ i)。所以我增加到1,循环运行打印1.
现在重复。每个循环为i打印一个更高的值,因为结束条件测试是预先递增的。
最终我达到127;它然后增加到128,但你打印它为“%d”期待一个有符号的整数,所以使用二进制补码将其解释为-128。
增量然后一直延续到255(打印为-1)。下一个预增量会导致溢出,所以我再次变为0,此时“结束条件测试”计算结果为false,循环停止。
这个程序有很奇怪的用于循环。 你通过检查它们初始化你的循环变量“i < = 5 & & i> = - 1” - 没有完成任务。 循环期间评估条件“++ i”,这是真实的,直到i = -1;并在增量步骤中检查数字是否大于零。
你做实际上:
for(i = 1; i != 0; i++)
{
printf("%d\t",i);
}
溢出以上127你从1到127的数字和从-128到-1。
虽然对于任何人都有好的阅读体验。 – 2013-02-28 14:32:40