Вызывает ли printf («% x», 1) неопределенное поведение?

Согласно стандарту C (6.5.2.2 параграф 6)

Если выражение, обозначающее вызываемую функцию, имеет тип, не включающий прототипа, целочисленные рекламные акции выполняются для каждого аргумента, а аргументы, которые имеют тип float повышаются до double. Они называются аргументом по умолчанию промо акции. Если количество аргументов не равно количеству параметров, поведение не определено. Если функция определена с типом, который включает прототип, и либо прототип заканчивается многоточием (, ...), либо типы аргументов после продвижение несовместимо с типами параметров, поведение не определено. Если функция определена с типом, который не включает прототип, и типы аргументы после продвижения несовместимы с аргументами после продвижение, поведение не определено, за исключением следующих случаев:

  • один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - это соответствующий беззнаковый целочисленный тип, и значение может быть представлено в обоих типах;
  • оба типа являются указателями на квалифицированные или неквалифицированные версии символьного типа или void.

Таким образом, в общем, нет ничего плохого в передаче int вариативной функции, которая ожидает unsigned int (или наоборот), пока передается значение подходит для обоих типов. Однако спецификация для printf гласит (7.19.6.1 параграф 9):

Если спецификация преобразования недопустима, поведение не определено. Если какой-либо аргумент неправильный тип для соответствующей спецификации преобразования, поведение undefned.

Никаких исключений для несоответствия знак / без знака не делается.

Означает ли это, что printf ("% x", 1) вызывает неопределенное поведение?

31
задан M.M 15 March 2016 в 04:06
поделиться