问题
I've the following program:
#include <stdio.h>
int main()
{
int ch;
while( ch = getchar() != '\n') {
printf("Read %c\n",ch);
}
return 0;
}
No matter what I enter I get:
Read
Why is this happening and what is that weird char that I see?
Stackoverflow is not printing the weird char. You can see it here: http://ideone.com/EfZHr
回答1:
You need to place parenthesis as:
while( (ch = getchar()) != '\n')
Precedence of !=
is greater than that of =
while( ch = getchar() != '\n')
is same as:
while( ch = (getchar() != '\n') )
which reads a char compares it with newline and then assigns the result of comparison to ch. Now the result of comparison is 0
(when newline is entered) or 1
(when anything else is entered)
The weird char you're seeing is the control char with value 1
, there is no printable symbol for ASCII 1, so I guess its the shell that prints the weird char with value 0001
in it.
You can confirm it by piping your program output to octal dump (od) :
$ echo 'a' | ./a.out | od -bc # user entered 'a'
0000000 122 145 141 144 040 001 012
R e a d 001 \n
here you go ----------------^
$ echo '\n' | ./a.out | od -bc # user entered '\n'
0000000
GCC when used with -Wall
warns you as:
warning: suggest parentheses around assignment used as truth value
回答2:
C (and C++) interpret the while loop as:
while( ch = (getchar() != '\n')) {
So ch
gets the value 1
(for true), which is an unprintable character. You should use explicit parenthesis to fix the precedence:
while( (ch = getchar()) != '\n') {
回答3:
ch = getchar() != '\n'
Writing this will cause unexpected behavior depending on the languages operator precedence. In C =
is evaluated after !=
so ch
will be true or false. Try:
(ch = getchar()) != '\n'
来源:https://stackoverflow.com/questions/3626905/why-does-this-c-program-print-weird-characters-in-output