Смешивание типов данных приводит к сердечному выбросу
Я дурачился с одной из примеров программ в K&R и обнаружил, что это
#include <stdio.h>
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%lf\n", nc );
putchar(nc);
}
выдает результат 3.000000 (что я полностью ожидал), а затем новую строку с сердцем (чего я совершенно не ожидал). Зачем выводить новую строку с сердцем? Я предполагаю, что это как-то связано со смешением типов данных.
1 ответ
Ты звонишь putchar()
с double
в качестве аргумента. Это будет неявным образом приведено к int
и тогда этот символ будет выведен. Вы получаете сердце, потому что по какой-то причине у вашего набора символов есть сердце как номер 3. Если вы запустите его и наберете еще несколько символов перед EOF
, вы получите другой характер. На моей машине твоя программа не имеет сердца, но если я наберу больше символов, я смогу получить все, что захочу, на следующей строке. ASCII символ 3 ETX
, конец текста, так что я не знаю, почему вы получили сердце в вашем случае - вы используете какой-то странный язык или набор символов? Что эта программа выводит на вашу машину:
#include <stdio.h>
int main(int argc, char *argv[])
{
putchar(3);
putchar('\n');
return 0;
}
Редактировать:
Вы получаете сердце, потому что это то, что находится в вашем наборе символов в позиции 3. Из Википедии:
На кодовой странице 437 в исходном наборе символов IBM PC значение 3 (шестнадцатеричное 03) представляет символ сердца. Это значение используется совместно с непечатным управляющим символом ETX, который переопределяет его во многих контекстах.