Respostas:
Eles são os mesmos quando usados para saída, por exemplo, com printf
.
No entanto, elas são diferentes quando usadas como especificador de entrada, por exemplo scanf
, with , onde %d
varre um número inteiro como um número decimal assinado, mas o %i
padrão é decimal, mas também permite hexadecimal (se precedido por 0x
) e octal (se precedido por 0
).
Então 033
seria 27 com %i
mas 33 com %d
.
printf
e scanf
.
Estes são idênticos para, printf
mas diferentes para scanf
. Para printf
, ambos %d
e %i
designe um número inteiro decimal assinado. Por scanf
, %d
e %i
também significa um inteiro assinado mas %i
inteprets a entrada como um número hexadecimal se precedido por 0x
e octal se precedido por 0
e de outra forma como interpreta a entrada decimal.
Não há diferença entre os especificadores %i
e %d
formato para printf
. Podemos ver isso indo para a seção preliminar do padrão C99 7.19.6.1
A função fprintf, que também abrange os printf
especificadores de formato e diz no parágrafo 8 :
Os especificadores de conversão e seus significados são:
e inclui o seguinte marcador:
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.
Por outro lado, pois scanf
há uma diferença, %d
assuma a base 10 enquanto %i
a detecção automática é feita. Podemos ver isso indo para a seção 7.19.6.2
A função fscanf, que aborda scanf
em relação ao especificador de formato, no parágrafo 12 diz:
Os especificadores de conversão e seus significados são:
e inclui o seguinte:
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.