下面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”使用 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 );
因为这:
for(i<=5 && i>=-1 ; ++i;i>0)
结果为
1)初始化:
i<=5 && i>=-1
什么也没做
2) 终止条件:
++i
递增 i 并在 i 变为零时终止
3) 每次循环执行的语句(通常是递增/递减):
i > 0
什么也没做。
所以你的代码从 i = 0 循环到它再次为零
我猜你错误地使用了for循环。
for(i<=5 && i>=-1 ; ++i;i>0)
上面的代码意思是:
i<=5 && i>=-1
(没有任何副作用,所以什么都没有发生)i
然后检查它是否为零。如果它不为零,则运行另一个迭代。i>0
(同样,什么也不做)。因此,您的循环简化为并且本质上是
while (++i)
为了解释您的结果,您使用的系统可能使用将 char 实现为带符号的二进制补码整数,当它高于 127 时“包装”为负数(因为 8 位二进制补码整数中的 128 是 - 128)
首先,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,请阅读
这是您的代码的细分,它相当偷偷摸摸:
for( i <= 5 && i >= -1 ; ++i; i > 0)
通常,for 循环是(初始语句、表达式、第二条语句)。在第一个空语句之前查看您的代码:您所做的是一个表达式(代替语句),这根本不重要,但它完全没用。所以删除那行(这对这个表达式的结果没有影响)给我们:
for( ; ++i; i > 0)
...现在,如果您注意到您i
在 for 循环之前初始化为 0。你接下来要做的是递增i
然后返回它的值(见这里),因此它将从 1 ... -1 开始(在 127 处溢出)。这是因为在 C 中任何非零值都是true
并且 0 是false
。因此,一旦i
变为 0,它将停止运行循环。i
只能通过溢出变为零。
您的第三个陈述无关紧要,无关紧要。