Jawaban:
Mereka sama ketika digunakan untuk output, misalnya dengan printf
.
Namun, ini berbeda ketika digunakan sebagai input specifier misalnya dengan scanf
, di mana %d
memindai bilangan bulat sebagai angka desimal yang ditandatangani, tetapi secara %i
default menjadi desimal tetapi juga memungkinkan heksadesimal (jika didahului oleh 0x
) dan oktal (jika didahului oleh 0
).
Jadi 033
akan dengan 27 %i
tetapi dengan 33 %d
.
printf
dan scanf
.
Ini identik untuk printf
tetapi berbeda untuk scanf
. Untuk printf
, keduanya %d
dan %i
menunjuk bilangan bulat desimal yang ditandatangani. For scanf
, %d
dan %i
juga berarti bilangan bulat bertanda tetapi %i
memasukkan input sebagai angka heksadesimal jika didahului oleh 0x
dan oktal jika didahului oleh 0
dan menafsirkan input sebagai desimal.
Tidak ada perbedaan antara penspesifikasi format %i
dan %d
untuk printf
. Kita bisa melihat ini dengan pergi ke standar rancangan C99 Bagian 7.19.6.1
Fungsi fprintf yang juga mencakup printf
sehubungan dengan format specifiers dan mengatakan dalam ayat 8 :
Penentu konversi dan artinya adalah:
dan termasuk peluru berikut:
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.
Di sisi lain untuk scanf
perbedaan, %d
asumsikan basis 10 sementara %i
otomatis mendeteksi basis. Kita dapat melihat ini dengan masuk ke bagian 7.19.6.2
Fungsi fscanf yang mencakup scanf
sehubungan dengan format specifier, dalam paragraf 12 dikatakan:
Penentu konversi dan artinya adalah:
dan termasuk yang berikut ini:
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.