Search code examples
ciooperator-precedencegetcharputchar

putchar() weird output, why is this happening?


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')

Solution

  • (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.