Существует специальное правило для функций со списками аргументов переменной длины, например printf
.В части переменной длины списка аргументов все целочисленные аргументы, меньшие int
, переводятся в int
, а float
в double
.Таким образом, оказывается, что совершенно нормально напечатать символ (или short
), используя %d
.
Эти продвижения аргументов по умолчанию в конечном итоге учитывают ряд аномалий в printf
.Можно подумать, что правильными спецификаторами формата для char
, short
, int
, float
и double
являются %hhd
, %hd
, %d
, %f
и %lf
соответственно.Но на самом деле вы можете уйти с %d
, %d
, %d
, %f
и %f
.printf
в основном игнорирует модификатор l
для чисел с плавающей запятой и, кажется, игнорирует модификатор h
для целых чисел.(На самом деле h
может иметь значение в неясных случаях, как объясняет chux в комментарии.)