4 ответов:
они одинаковы при использовании для вывода, например, с
printf.однако они отличаются при использовании в качестве спецификатора ввода, например, с
scanf, где%dсканирует целое число как десятичное число со знаком, но%iпо умолчанию десятичное, но также позволяет шестнадцатеричное (если предшествует0x) и восьмеричный, если ему предшествует0.так
033было бы 27 с%iно 33 с%d.
они идентичны для
printfно разных поscanf. Ибоprintf, и%dи%iобозначьте знаковое десятичное целое число. Ибоscanf,%dи%iтакже означает целое число а%iвводится в виде шестнадцатеричного числа, если ему предшествует0xи восьмеричный, если ему предшествует0и в противном случае интерпретирует входные данные как десятичные.
нет никакой разницы между
%iи%dспецификаторы формата дляprintf. Мы можем увидеть это, зайдя в проект стандарта C99 раздел7.19.6.1функция fprintf, который также охватываетprintfчто касается спецификаторов формата, и он говорит в пункте 8:спецификаторы преобразования и их значения:
и включает в себя следующие пуля:
d,i The int argument is converted to signed decimal in the style [−]dddd. The precision specifies the minimum number of digits to appear; if the value being converted can be represented in fewer digits, it is expanded with leading zeros. The default precision is 1. The result of converting a zero value with a precision of zero is no characters.С другой стороны для
scanfесть разница,%dпредположим, что база 10 в то время как%iавтоматически обнаруживает базы. Мы можем увидеть это, перейдя в раздел7.19.6.2функция fscanf охватываетscanfв отношении спецификатора формата, в пункте 12 он говорит:спецификаторы преобразования и их значения:
и включает в себя следующее:
d Matches an optionally signed decimal integer, whose format is the same as expected for the subject sequence of the strtol function with the value 10 for the base argument. The corresponding argument shall be a pointer to signed integer. i Matches an optionally signed integer, whose format is the same as expected for the subject sequence of the strtol function with the value 0 for the base argument. The corresponding argument shall be a pointer to signed integer.
Comments