Risposte:
Sono gli stessi se utilizzati per l'output, ad es printf
. Con .
Tuttavia, questi sono diversi se utilizzati come identificatore di input, ad esempio con scanf
, dove %d
esegue la scansione di un numero intero come numero decimale con segno, ma il %i
valore predefinito è decimale ma consente anche esadecimale (se preceduto da 0x
) e ottale (se preceduto da 0
).
Quindi 033
sarebbe 27 con %i
ma 33 con %d
.
printf
e scanf
.
Questi sono identici per printf
ma diversi per scanf
. Per printf
, sia %d
e %i
designare un intero decimale con segno. Perché scanf
, %d
e %i
significa anche un numero intero con %i
segno ma integra l'input come un numero esadecimale se preceduto da 0x
e ottale se preceduto da 0
e interpreta in altro modo l'input come decimale.
Non vi è alcuna differenza tra gli identificatori di formato %i
e %d
per printf
. Possiamo vederlo andando alla bozza della sezione standard C99 7.19.6.1
La funzione fprintf che copre anche printf
per quanto riguarda gli identificatori di formato e dice nel paragrafo 8 :
Gli identificatori di conversione e i loro significati sono:
e include il seguente punto elenco:
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.
D'altra parte perché scanf
c'è una differenza, %d
supponiamo che la base 10 %i
rilevi automaticamente la base. Possiamo vederlo andando alla sezione 7.19.6.2
La funzione fscanf che copre scanf
rispetto allo specificatore di formato, al paragrafo 12 dice:
Gli identificatori di conversione e i loro significati sono:
e include quanto segue:
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.