为什么会出现无限循环?

5
我尝试将255个ASCII字符写入控制台,但是遇到了无限循环。
for(char i=0; i<256; i++) {
    cout << i << ' ';
}

4
char 改为 int 并注意其中的区别。 - K. Brafford
你并不会通过将“i”定义为“char”来节约任何东西。使用“int”类型,因为它是你的架构上整数的自然大小(因此在这种循环中最有效率)。 - Martin York
4个回答

13

因为i永远不可能大于或等于256。在这之前它会溢出。请记住,i的类型是char,如果它是无符号的,则其最大值可以为255,否则如果它是有符号的,则最大值为127

char无符号的还是有符号的,是由实现定义的。但通常情况下,根据我的经验,它是有符号的,这意味着char通常能达到的最大值为127

如果i有符号的,那么它将从0递增到127,然后变为-128,再从-128递增到127,以此类推。如果i无符号的,那么它将从0递增到255,然后变为0(由于溢出),故事就这样开始了,一次又一次!


对于(unsigned char i=0; i<256; i++) { cout << i << ' '; } - Hard Rain
3
@HardRain: 那是什么?甚至那也是一个无限循环。 - Nawaz

5
因为所有的char值都小于256。
在比较时,char i被转换为int类型,在有符号二进制补码8位char中通常会产生-128至127之间的值,如果char是一个无符号的8位类型,那么会产生0到255(包括255)之间的值。
一旦char可容纳的最大值被达到,如果char是无符号的,进一步增加将导致环绕回到0,并且当它被存储回去时,128增量产生的int值被实现定义地转换成char,通常结果是-128,当char是带符号的时。

3
您应该开启编译警告 (-Wtautological-compare 用于此问题)。
在 C++ 中,每种整数类型都有一定的可能值范围。这个范围通常是实现定义的,但在常见平台(x86)上,以下是常见的范围:
  • signed char 在 [-128, +127] (+) 范围内
  • short 在 [-2*15, 2*15-1] 范围内
  • int 在 [-2*31, 2*31-1] 范围内
如果您试图将带符号整数类型的值增加到其最大值以上,则会进入到未定义行为的领域。在常见的实现中,它会绕回到最小值(就像无符号类型一样),所以当处理 char 时, 127 + 1 就会变成 -128。
当您与 256 进行比较时,首先将值从 i 转换为一个 int(没有整数后缀的 256 的类型),然后执行比较。但是,由于 i 总是在 [-128,127] (+)范围内,因此它始终小于 256,因此条件始终为真。 (+) 是否将 char 作为有符号还是无符号类型是实现定义的,如果 char 是无符号的,则其范围更可能是 [0, 255]。

2

试试这个!

for(int i=0; i<256; i++)
 {
    cout << char(i) << " ";
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接