2010-02-28 3 views
1

я дурачился с одним из примеров программ в K & R, и обнаружили, что этоСмешение типов данных приводит к выходу сердца

#include <stdio.h> 

main() 
{ 
    double nc; 

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

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

+0

Я знаю, почему новая линия - просто интересует, почему форму сердца. – Laura

ответ

2

В качестве аргумента вы вызываете putchar() с double. Он будет получать неявно typecast до int, а затем этот символ будет выводиться. Вы получаете сердце, потому что по какой-то причине ваш набор символов имеет сердце в качестве символа номер 3. Если вы запустите его и введите еще больше символов до EOF, вы получите другой символ. На моей машине ваша программа не делает сердце, но если я наберу больше символов, я могу получить все, что захочу, на следующей строке. Символ ASCII 3 равен 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, который переопределяет его во многих контекстах.

+0

Это просто делает сердце, когда я его запускаю. :) – Laura

+0

@ Лаура, да, это ожидается. Я отредактировал свой ответ с дополнительной информацией. Характер 3 - это сердце, и это все, что ему нужно. –

+0

Спасибо! Узнал немного больше сегодня :) – Laura

Смежные вопросы