2017-02-18 7 views
-4
#include <stdio.h> 

int main(void) 
{ 
    char i=49; 
    printf("%d",i); 
    return 0; 
} 

Почему выходной сигнал составляет 49?Почему это дает мне результат 49?

Я использую %d для печати символа, тогда как мое объявление символа также неверно.

+1

"% d" говорит печати целое число, вы не питали его целым числом, поэтому он делает все возможное. Как правило, это не очень хорошо, но [variadic promotion] (http://en.cppreference.com/w/cpp/language/variadic_arguments) экономит ваш бекон здесь. – user4581301

+1

'char' - целочисленный тип, и хотя обычно он более узкий, чем' int', он преобразуется в 'int' при передаче функции, подобной' printf() ', с помощью списка переменных аргументов. – Dmitri

+0

Все вышеприведенные комментарии должны быть ответом, а не комментарием ... – Phong

ответ

0

Обновление ответа на основе комментариев.

char - это тип integer, и вы назначаете 49 этому целочисленному типу. Спецификатор преобразования% d печатает значение целого числа;

char i=49; 

Если вы печатаете "%c" вы можете увидеть соответствующий характер значения ASCii 49 т 1

Поскольку вы используете "%d" вы получаете само целое значение.

Вы можете попробовать это

char i='1'; 

Теперь попробуйте printf("%d",i); вы получите 49

+0

@DavidBowling Я согласен с вами. Я имел в виду, когда мы присваиваем целочисленное значение типу char, этому символу присваивается символ ascii, соответствующий этому целому числу. – jophab

+0

Какова эта концепция в c называется? хорошо, что происходит, когда мы используем char i = 49; int i = 59, а затем printf ("% d", i); –

+0

@AnkitArora просто попробуйте.Thats hw мы узнаем – jophab

0

% D,% С,% о,% х ... они называются спецификатор формата. он решит, какой тип вывода вы хотите.

в вашем примере, вы назначили 49 в i и сказали компилятору, что вы хотите, чтобы результат был десятичным.

если вы пытаетесь напечатать то же самое, заменив% D с% с, то он будет печатать

1, поскольку он предполагает, что вывод должен быть печать в виде полукокса эквивалент заданного числа

где в ASCII таблице 49 является 1

и FYI

в реализации функции PRINTF они будут иметь дело символа «%», за которой следует символ как специальный случай

если последовал символ действителен, то он будет выводить

% х гекс % d десятичное % я это целое число % с является символ % s является строка % F является поплавок .... ............ и т. д. вы можете Google формальный спецификатор в c «будет множество результатов

надеюсь, эта информация вам полезна.

+0

, когда я пишу char i = 49.012 и использую printf ("% f", i); почему% f не напечатал его значение float .... он дает мне ответ 0.00000? почему его так? –

1

В C a char означает то же, что и байт; это наименьшая адресуемая часть памяти, а также наименьший из целочисленных типов. 49 представляет собой целочисленную константу типа int, имеющую значение 49. '1' является символьной константой, которая также имеет тип int! И на ASCII-системах '1' в качестве значения 49 (код ASCII символа 1).

printf спецификатор преобразования %d ожидает, что соответствующий аргумент будет int, значение которого затем печатается в десятичной системе. Остальные аргументы после строки формата подлежат рекламным акциям по умолчанию; каждый целочисленный тип, меньший, чем int, составляет int; и float - double. Так как i имеет целочисленный тип, меньший, чем int, его значение (49) теперь повышается до int и до printf оно выглядит точно так же, как если бы было задано любое другое целочисленное значение 49.

Для печати символа, характер которого код 49, вам нужно использовать спецификатор %c преобразования; printf выдает 1, который является символом кода 49; даже сейчас, аргумент повышен до int и printf внутренне преобразует это значение к unsigned char, который затем будет выводиться (source):

гр

[...] int аргумент преобразуется к unsigned char, и полученный символ записывается. [...]


Добавление: в коде

char i = 49.012; 
printf("%f", i); 

49.012 является значение типа double; это преобразуется в целое число целых чисел путем измельчения десятичных знаков, поэтому значение, хранящееся в i, равно , но снова 49; который можно доказать, напечатав его %d. Теперь %f ожидает, что соответствующий аргумент имеет тип double, но i вместо этого преобразуется в int; использование аргумента неправильного типа при вызове printf имеет неопределенное поведение, то есть все может случиться. Если компилирует с gcc -Wall, получают следующее сообщение об ошибке:

предупреждение: формат %f ожидает аргумент типа double, но аргумент 2 имеет тип int [-Wformat =]

+0

когда я пишу char i = 49.012 и использую printf ("% f", i); почему% f не напечатал его значение float .... он дает мне ответ 0.00000? почему его так? –

+0

@AnkitArora добавлено –

+0

что добавил.plz объяснить мне подробно я новичок в программировании c –

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