Является ли printf ("% d", 1.0) неопределенным? - PullRequest
1 голос
/ 08 июля 2011

В соответствии с разделом 4.9.6.1 C89 черновик ,% d является символом, который указывает тип преобразования , которое будет применено.

Слово преобразование подразумевает, на мой взгляд, printf("%d", 1.0) определено.

Пожалуйста, подтвердите или опровергните это.

Ответы [ 4 ]

12 голосов
/ 08 июля 2011

Преобразование - это преобразование языкового значения в лексическое представление этого значения.

Ваша теория неверна;поведение не определено.Спецификация говорит (7.19.6.1p8 и 9, используя C99 TC2):

Аргумент int преобразуется в десятичный знак со знаком в стиле [-] dddd.

И

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

8 голосов
/ 08 июля 2011

Printf - это функция varargs, поэтому преобразование невозможно.Компилятор просто помещает двойные в список аргументов.Printf не может выяснить, что это двойник против int против слона.Результат?Хаос.

2 голосов
/ 08 июля 2011

Слово «преобразование» здесь относится к преобразованию int (который здесь является единственным приемлемым типом аргумента) в строку символов, которые составляют десятичное представление этого int. Это не имеет никакого отношения к преобразованию из других типов (таких как double) в int.

0 голосов
/ 08 июля 2011

Не уверен, если это официально не определено или ошибка - но это неправильно!

...