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 %dvarre um número inteiro como um número decimal assinado, mas o %ipadrão é decimal, mas também permite hexadecimal (se precedido por 0x) e octal (se precedido por 0).
Então 033seria 27 com %imas 33 com %d.
printfe scanf.
Estes são idênticos para, printfmas diferentes para scanf. Para printf, ambos %de %idesigne um número inteiro decimal assinado. Por scanf, %de %itambém significa um inteiro assinado mas %iinteprets a entrada como um número hexadecimal se precedido por 0xe octal se precedido por 0e de outra forma como interpreta a entrada decimal.
Não há diferença entre os especificadores %ie %dformato 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 printfespecificadores 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 scanfhá uma diferença, %dassuma a base 10 enquanto %ia detecção automática é feita. Podemos ver isso indo para a seção 7.19.6.2 A função fscanf, que aborda scanfem 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.