If I type the words "Hello World" into the standard input stream, this program will print out weird box symbols instead of the expected "Hello World" back into standard output.
#include <stdio.h>
int main(void)
{
// print out all characters from the stream until '/n' character is found
int ch;
while (ch = getchar() != '\n')
{
putchar(ch);
}
putchar('\n');
}
I am aware of how to fix the problem. But why is this line of code incorrect?
while (ch = getchar() != '\n')
(ch = getchar() != '\n')
should be rewritten as
((ch = getchar()) != '\n')
Because !=
binds tighter than =
in C operator precedence table. Operator are not ordered from left to right (reading direction of english) as one might expect. For example result of 2 + 3 * 5
is 17
and not 25
. This is because *
will be performed before performing +
, because *
operator has more precedence than +
operator.
So when you write something like
ch = getchar() != '\n'
You expect it to be equivalent to: (ch = getchar()) != '\n'
But actually it is equivalent to: ch = (getchar() != '\n')
Because the result of !=
is either true
or false
, you see character \001
on screen. I believe \001
appears as boxes1 on your system.
1: Character \001
may appear as a box or dot or some wierd character or it may not appear in output at all.