I'm learning K&R's classic C programming book 2nd edition, here's an example on page 17:
#include <stdio.h>
/* copy input to output*/
main()
{
int c;
// char c works as well!!
while ((c = getchar()) != EOF)
putchar(c);
}
it's stated in the book that int c
is used to hold EOF
, which turns out to be -1
in my Windows machine with GCC and can't be represented by char
. However, when I tried char c
it works with no problem. Curiously I tried some more:
int a = EOF;
char b = EOF;
char e = -1;
printf("%d %d %d %c %c %c \n", a, b, e, a, b, e);
and the output is -1 -1 -1
with no character displayed (actually according to ASCII table for %c, c
here there should be a nbs(no-break space)
displayed but it's invisible).
So how can char
be assigned with EOF
without any compiler error?
Moreover, given that EOF
is -1
, are both b
and e
above assigned FF
in memory? It should not be otherwise how can compiler distinguish EOF
and nbs
...?
Update:
most likely EOF 0xFFFFFFFF
is cast to char 0xFF
but in (c = getchar()) != EOF
the the LHS 0xFF
is int promoted to 0xFFFFFFFF
before comparison so type of c
can be either int
or char
.
In this case EOF
happens to be 0xFFFFFFFF
but theoretically EOF
can be any value that requires more than 8 bits to correctly represent with left most bytes not necessarily being FFFFFF
so then char c
approach will fail.
Reference: K&R The C Programming Language 2e
EOF
and 0xFF
are not the same. So compiler has to distinguish between them. If you see the man page for getchar()
, you'd know that it returns the character read as an unsigned char cast to an int or EOF on end of file or error.
Your while((c = getchar()) != EOF)
is expanded to
((unsigned int)c != (unsigned int)EOF)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With