Смешивание типов данных приводит к сердечному выбросу - PullRequest
1 голос
/ 01 марта 2010

Я дурачился с одной из примеров программ в K & R и обнаружил, что это

#include <stdio.h>

main()
{
    double nc;

    for (nc = 0; getchar() != EOF; ++nc)
        ;
    printf("%lf\n", nc );
    putchar(nc);
}

выдает результат, равный 3.000000 (что я полностью ожидал), а затем новую строку с сердцем (чего я совершенно не ожидал). Зачем выводить новую строку с сердцем? Я предполагаю, что это как-то связано со мной, смешивая типы данных.

1 Ответ

2 голосов
/ 01 марта 2010

Вы звоните putchar() с double в качестве аргумента. Он будет неявным образом приведен к типу int, и затем этот символ будет выведен. Вы получаете сердце, потому что по какой-то причине у вашего набора символов есть сердце как номер 3. Если вы запустите его и наберете еще несколько символов до EOF, вы получите другой символ. На моей машине твоя программа не имеет сердца, но если я наберу больше символов, я смогу получить все, что захочу, на следующей строке. 3-й символ ASCII - ETX, конец текста, так что я не знаю, почему в вашем случае вы получили суть - вы используете какой-то странный язык или набор символов? Что эта программа выводит на ваш компьютер:

#include <stdio.h>

int main(int argc, char *argv[])
{
    putchar(3);
    putchar('\n');
    return 0;
}

Edit:

Вы получаете сердце, потому что это то, что находится в вашем наборе символов в позиции 3. Из wikipedia :

В кодовой странице 437, исходном наборе символов IBM PC, значение 3 (шестнадцатеричное 03) представляет символ сердца. Это значение используется совместно с непечатным управляющим символом ETX, который переопределяет его во многих контекстах.

...