Во-первых, принимая, что сравнение getchar()!=EOF
даст логическое значение, которое будет преобразовано либо в 1
(для истины), либо в 0
(ложь), когда интерпретируется как любой целочисленный тип, оператор:
printf("%d",getchar()!=EOF);
печатает значение этого преобразования в виде в формате целое число - так вы увидите напечатанные «1» или «0».
Однако, оператор:
putchar(c);
выводит фактический символ, представленный значением c
(часто, но не обязательно, значением ASCII). Символы, представленные 0
и 1
, не являются печатными символами, поэтому ваша консоль отобразит что-то, указывающее, что - в вашем случае, знак вопроса.