Respuestas:
Ellos son los mismos cuando se utiliza para la salida, por ejemplo con printf
.
Sin embargo, estos son diferentes cuando se usan como especificador de entrada, por ejemplo scanf
, con , donde %d
escanea un número entero como un número decimal con signo, pero por %i
defecto es decimal pero también permite hexadecimal (si está precedido por 0x
) y octal (si está precedido por 0
).
Entonces 033
sería 27 con %i
pero 33 con %d
.
printf
y scanf
.
Estos son idénticos para printf
pero diferentes para scanf
. Para printf
, ambos %d
y %i
designan un entero decimal con signo. For scanf
, %d
y %i
también significa un entero con signo, pero %i
interpreta la entrada como un número hexadecimal si está precedido por 0x
y octal si está precedido por 0
y de lo contrario interpreta la entrada como decimal.
No hay diferencia entre los especificadores de formato %i
y . Podemos ver esto yendo al borrador de la sección estándar C99 La función fprintf que también cubre con respecto a los especificadores de formato y dice en el párrafo 8 :%d
printf
7.19.6.1
printf
Los especificadores de conversión y sus significados son:
e incluye la siguiente viñeta:
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 otro lado, porque scanf
hay una diferencia, %d
asuma la base 10 mientras %i
auto detecta la base. Podemos ver esto yendo a la sección 7.19.6.2
La función fscanf que cubre scanf
con respecto al especificador de formato, en el párrafo 12 dice:
Los especificadores de conversión y sus significados son:
e incluye lo siguiente:
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.