Допустим, у нас есть эта строка кода:
printf("%hi", 6);
Предположим, sizeof(short) == 2 и sizeof(int) == 4.
printf ожидает short, но получает int, который шире. Это неопределенное поведение?
То же самое с %hhi.
@P.W Да, но я точно не знаю, как работают параметры printf. Я только знаю, что они работают очень странно. Я думаю, что это не так просто, как «приведение к нужному типу».
Читать о продвижение аргументов по умолчанию
@П.В. Почему вы цитируете c++ ссылки для c вопроса?
@Vagish Моя ссылка для C.
@Barmar Пример по этой ссылке немного забавен, потому что все параметры уже int, поэтому рекламные акции не действуют.
@CacahueteFrito Насколько я понимаю, cppreference.com — это и C, и C++, и все страницы помечены соответствующим образом.
@CacahueteFrito: Если вам удобно читать стандарт. Затем см.: open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf. Раздел 7.21.6.1
Ответ на этот вопрос зависит от того, насколько буквально вы хотите воспринимать формулировку стандарта (т. е. насколько педантичными вы себя чувствуете). Спецификация printf имеет несколько проблем, которые требуют подхода, основанного на здравом смысле, а не буквального прочтения.
@M.M Буквально, поскольку любой автор компилятора (в основном я использую GCC) примет это, так что любые оптимизации / реализации, которые они когда-либо делают, никогда не нарушают мой код :) (Обычные флаги -std=c17 -O3 -Wall -Wextra -Werror, без педантичного режима)
Я с нетерпением жду того дня, когда printf("%u", 1); отформатирует жесткий диск





printf() на самом деле не ожидает, что аргумент будет short, когда вы используете %hi. Когда вы вызываете функцию с переменным числом аргументов, все аргументы подвергаются продвижение аргумента по умолчанию. В случае целочисленных аргументов это означает продвижение целых чисел, что означает, что все целочисленные типы, меньшие int, преобразуются в int или unsigned int.
Если соответствующий аргумент является литералом, все, что требуется, это чтобы это было значение, которое вписывается в short, на самом деле вам не нужно приводить его к short.
Раздел 7.21.6.1.7 стандартный объясняет это следующим образом:
the argument will have been promoted according to the integer promotions, but its value shall be converted to
short intorunsigned short intbefore printing
В стандарте это объясняется (как минимум) в 7.21.6.1.7.
Спасибо, я добавил соответствующую строку из этого раздела.
Разве
6не подходит кshort?