I am programming in c on ubuntu terminal gcc compiler. printf is not giving any output. Please explain why.
#include <stdio.h>
int main()
{
int c;
while (c = getchar() == EOF)
{
printf("%d\n", (int)c);
}
return 0;
}
To ammend the other answer, see the operator precedence table.
The equality operator ==
has higher precedence over the assignment =
, so in your case, first the equality check will take place and then the result will get assigned, which is what you don't want. So, a statement like
(c = getchar() == EOF)
gets grouped like
( c = (getchar() == EOF) )
which is wrong.
Printf not printing out the expected result, why?
To elaborate the no output part, in your case, the result of the comparison is either a 0 or 1. Related, quoting C11
, chapter ยง6.5.9
[...] Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has type
int
. [...]
So, the assigned value is either 0
or 1
, and you try to print it using %c
format specifier. This value(s) does not have a printable representation, thus you don't see any output.
FWIW, here's a list of printable and non-printable values.
Solution: Make it explicit, using a pair of parenthesis to enforce the order of execution of the sub-expressions, like
while ( (c = getchar()) != EOF )
That said,
The conforming signature of main()
is int main(void)
, at at least in a hosted enviroment.
The cast to (int)
is superfluous, (if in lesser rank than int
) the supplied argument is implicitly promoted, anyway.
means
c = (getchar() == EOF)
as the assignment expression is right-associative and has the lowest priority from all the expressions apart from comma-expression.which means for your code,
c = 0
almost all the time. So the loopwhile(0)
is not executed.You mean
while ((c = getchar()) != EOF)
.Also, it is no need to cast
c
toint
inbecause the
default argument promotions
do it automatically.The correct code may be so: