在下面的程序中
#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。
为什么会这样?
在下面的程序中
#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。
为什么会这样?
这一定是我一生中见过的最畸形的 for 循环。for 循环的格式如下
for ( initalization; condition; update )
在for
循环的开始,initialization
发生。这通常类似于i = 0
. 在每个循环的顶部,condition
(通常类似于i < 5
)被评估以查看循环是否应该继续,如果循环继续,update
则执行(再次,通常类似于++i
),并且循环再次执行。
这里发生的事情是循环++i
用作条件,所以它只会在++i
计算为一个0
值时终止,所以你从开始1
并递增直到从tochar i
溢出,然后继续递增直到它达到,此时评估为和循环终止128
-127
-1
++i
0
编辑
因此,根据您的代码,i<=5 && i>=-1
在循环的第一次迭代的最开始执行(这完全没有完成任何事情),然后++i
评估布尔状态(0
开始,并使用预增量,评估是1
,因此,而不是0
布尔值通过),然后执行update
部分i>0
,它再次什么也不做。
编辑2
如果你的问题真的是关于为什么会这样,1,2....128,-127,-126....-1
那么 Joachim 对这种行为提供了一个很好的解释
好消息:在您的实施中,char
已签署!
此外,发生的情况是i
从 127 溢出到 -128 的值,因为 127 是适合带符号的最大正值char
。
编辑:实际上,我不确定char
您的实现中的签名,但是循环完全被破坏了:
应该是
for (i = 0; i <= 5; i++)
但这只是一个猜测。很难解释。
您可能想阅读有关二进制补码表示的信息
Achar
是编译器中的有符号 8 位整数。它可以表示从 -128 到 +127 的值。循环结束条件是++i
,并且在 C 中所有非零值都被认为是真的,所以它将循环直到++i
为零,这将在i
is时发生-1
。
if 从 127 变为 -128 的原因是有符号整数在计算机中的工作方式。127 的二进制位是01111111
,-128 的位模式是1000000
。加一01111111
将导致10000000
.
总而言之,你的for
循环没有真正的意义。它在语法上是正确的,但没有任何意义。有关 for 循环如何工作的解释,请参阅 Dan F 的答案。
顺便说一句,那个 for 循环太可怕了。你知道它应该是for(intialisation; end condition; increment)
,对吧?
反正。i 初始化为 0;for 循环的第一个循环是测试具有预增量的结束条件 (++i)。所以我递增到 1,循环运行以打印 1。
现在重复。每个循环都会为 i 打印一个更高的值,因为结束条件测试是预先增加 i 的。
最终我达到了 127;然后它递增到 128,但您将其打印为“%d”,它需要一个有符号整数,因此使用二进制补码将其解释为 -128。
然后增量一直持续到 255(打印为 -1)。下一个预增量导致溢出,因此 i 再次变为 0,此时“结束条件测试”评估为 false 并且循环停止。
这个程序有很奇怪的用于循环。您通过检查它们“i<=5 && i>=-1”来初始化循环变量 - 没有完成分配。在循环期间,您评估条件“++i”,直到 i = -1; 在增量步骤中,您只需检查数字是否大于零。
你实际上是这样做的:
for(i = 1; i != 0; i++)
{
printf("%d\t",i);
}
溢出高于 127 时,您会得到从 1 到 127 以及从 -128 到 -1 的数字。
程序在打印时将“i”解释为一个 8 位有符号整数,即 1 位用于符号,7 位用于数据。这为您提供了 -128 到 127 的有效值范围。
“for”循环在 printf 之前预先递增i,因此给它一个第一次传递值 1,并且递增一直持续到 i+1=128 - 它翻转有符号整数中的符号位,然后运行循环直到 ++ i 导致 i 为 0。