要了解这是如何工作的,请想象一下编写 getchar 的人的想法。你需要读取一个文件。首先创建一个例程 - 例如:
unsigned char get_me_a_byte(file)... // 0..255
现在您想从文件中读取所有字节:
unsigned char c;
while( c = get_me_a_byte(file) ) // while( (c = get_me_a_byte(file)) != 0 )
{
... do sth
}
问题是它会在遇到 z 零时停止,但是一旦一切都是红色的,您就想停止。现在你变得更聪明了——你知道文件可以被认为是字节序列。如果您的get_me_a_byte可以返回 16 位或 32 位类型怎么办?然后你可以使用一些字节不能保存的值作为文件结束标记。
答对了
由于决定权在您手中,您可能有:
int get_me_a byte_U(file) ... // returning bytes as 0..255
int get_me_a byte_S(file) ... // returning bytes as -128..127
现在你可以这样做:
int c;
while( (c = get_me_a_byte_U(file) != UUU ) ....
其中UUU可以是您平台上从 256 到 MAXINT 的任何值
相似地:
int c;
while( (c = get_me_a_byte_S(file) != SSS ) ....
其中SSS可以是 MININT..-129 和 128..MAXINT 中的任何内容
现在,如果您选择第一种方法,则会出现一个问题:UUU(您的 EOF)的值应该是多少?
(-1) 对 EOF 有好处,因为无论您分配给它的变量的位宽是多少,它都将保持 (-1)。'保持-1'我的意思是它永远都是一个模式。
char c = -1; // c = 11111111b / 0xFF / 255 (assuming your char is signed 8bit)
short s = -1; // s = 1111111111111111b / 0xFFFF / 65535
int i = -1; // s = 11111111111111111111111111111111b / 0xFFFFFFFF / 4294967295
现在应该很明显了。