printf слишком умное приведение от char к int? - PullRequest
8 голосов
/ 18 октября 2010

Почему следующий звонок:

printf("%d %d", 'a', 'b');

результат в "правильных" 97 98 значениях? % d указывает, что функция должна прочитать 4 байта данных, и printf не должен быть в состоянии определить тип полученных аргументов (кроме строки формата), так почему же не напечатанное число |a||b||junk||junk|?

Заранее спасибо.

Ответы [ 3 ]

15 голосов
/ 18 октября 2010

В этом случае параметры, полученные printf, будут иметь тип int.

Прежде всего, все, что вы передаете в printf (кроме первого параметра), подвергается "продвижению по умолчанию", что означает (среди прочего), что char и short оба повышаются до int перед передачей. Таким образом, даже если то, что вы передавали, действительно имело тип char, к моменту, когда оно достигло printf, оно имело бы тип int. В вашем случае вы используете символьный литерал, который в любом случае уже имеет тип int.

То же самое верно для scanf и других функций, которые принимают переменные параметры.

Во-вторых, даже без повышений по умолчанию символические литералы в C уже в любом случае имеют тип int (§6.4.4.4 / 10):

Целочисленная символьная константа имеет тип int.

Итак, в этом случае значения начинаются с типа int и не повышаются - но даже если вы начали с char s, что-то вроде:

char a = 'a';

printf("%d", a);

... то, что получает printf, будет иметь тип int, а не тип char в любом случае.

4 голосов
/ 18 октября 2010

В C символьный литерал является значением типа int.

0 голосов
/ 18 октября 2010

печатает DEC ASCII для введенных вами символов.

...