我尝试将255个ASCII字符写入控制台,但是遇到了无限循环。
for(char i=0; i<256; i++) {
cout << i << ' ';
}
for(char i=0; i<256; i++) {
cout << i << ' ';
}
因为i
永远不可能大于或等于256
。在这之前它会溢出。请记住,i
的类型是char
,如果它是无符号的,则其最大值可以为255
,否则如果它是有符号的,则最大值为127
。
char
是无符号的还是有符号的,是由实现定义的。但通常情况下,根据我的经验,它是有符号的,这意味着char
通常能达到的最大值为127
。
如果i
是有符号的,那么它将从0
递增到127
,然后变为-128
,再从-128
递增到127
,以此类推。如果i
是无符号的,那么它将从0
递增到255
,然后变为0
(由于溢出),故事就这样开始了,一次又一次!
-Wtautological-compare
用于此问题)。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]。
试试这个!
for(int i=0; i<256; i++)
{
cout << char(i) << " ";
}
char
改为int
并注意其中的区别。 - K. Brafford