Is EOF always negative?
Yes, EOF is always negative.
The Standard says:
7.19 Input/output
7.19.1 Introduction3 The macros are [...] EOF which expands to an integer constant expression, with type int and a negative value, that is returned by several functions to indicate end-of-file, that is, no more input from a stream;
Note that there's no problem with "plain" char
being signed. The <stdio.h>
functions which deal with char
s, specifically cast the characters to unsigned char
and then to int
, so that all valid characters have a positive value. For example:
int fgetc(FILE *stream)
7.19.7.1
... the fgetc function obtains that character as an unsigned char converted to an int ...
EOF
is always == EOF
. Don't assume anything else.
On a second reading of the standard (and as per some other comments here) it seems EOF
is always negative - and for the use specified in this question (line number or EOF
) it would work. What I meant to warn against (and still do) is assuming characters are positive and EOF
is negative.
Remember that it's possible for a standard conforming C implementation to have negative character values - this is even mentioned in 'The C programming language' (K&R). Printing characters are always positive, but on some architectures (probably all ancient), control characters are negative. The C standard does not specify whether the char
type is signed or unsigned, and the only character constant guaranteed to have the same value across platforms, is '\0'
.