Câu trả lời:
Chúng giống nhau khi được sử dụng cho đầu ra, ví dụ với printf
.
Tuy nhiên, chúng khác nhau khi được sử dụng làm công cụ xác định đầu vào, ví dụ như scanf
, trong đó %d
quét một số nguyên dưới dạng số thập phân đã ký, nhưng %i
mặc định là thập phân nhưng cũng cho phép thập lục phân (nếu đứng trước 0x
) và bát phân (nếu đứng trước 0
).
Vì vậy, 033
sẽ là 27 với %i
nhưng 33 với %d
.
printf
và scanf
.
Đây là giống hệt nhau printf
nhưng khác nhau cho scanf
. Cho printf
, cả hai %d
và %i
chỉ định một số nguyên thập phân đã ký. Cho scanf
, %d
và %i
cũng có nghĩa là một số nguyên đã ký nhưng đặt %i
nội dung đầu vào dưới dạng số thập lục phân nếu đứng trước 0x
và bát phân nếu đứng trước 0
và diễn giải đầu vào là số thập phân.
Không có sự khác biệt giữa các định dạng %i
và %d
định dạng cho printf
. Chúng ta có thể thấy điều này bằng cách vào tiêu chuẩn dự thảo C99 phần 7.19.6.1
Chức năng fprintf mà cũng bao gồm printf
sự tôn trọng sang định dạng specifiers với và nó nói tại khoản 8 :
Các chỉ định chuyển đổi và ý nghĩa của chúng là:
và bao gồm các viên đạn sau:
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.
Mặt khác, để scanf
có sự khác biệt, %d
giả sử cơ sở 10 trong khi %i
tự động phát hiện cơ sở. Chúng ta có thể thấy điều này bằng cách vào phần 7.19.6.2
Chức năng fscanf trong đó bao gồm scanf
sự tôn trọng để format specifier với, tại khoản 12 nó nói:
Các chỉ định chuyển đổi và ý nghĩa của chúng là:
và bao gồm những điều sau đây:
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.