[英]%i or %d to print integer in C using printf()?
我只是在學習 C,由於涉足 iOS 開發,我對 Objective-C 有一點了解,但是,在 Objective-C 中我使用的是NSLog(@"%i", x);
將變量x打印到控制台,但是我一直在閱讀一些 C 教程,他們說使用%d
而不是%i
。
printf("%d", x);
和printf("%i", x);
兩者都正確地將x打印到控制台。
這些似乎都讓我到了同一個地方,所以我問有經驗的開發人員哪個更受歡迎? 在語義上是正確的還是正確的?
當與printf()
一起使用時,它們是完全等效的。 就個人而言,我更喜歡%d
,它使用得更頻繁(我應該說“它是int
的慣用轉換說明符”嗎?)。
( %i
和%d
之間的一個區別是,當與scanf()
, %d
總是期望一個十進制整數,而%i
將0
和0x
前綴識別為八進制和十六進制,但沒有理智的程序員無論如何都使用scanf()
所以這不應該是一個問題。)
我只是在這里添加示例,因為我認為示例更容易理解。
在 printf() 中,它們的行為相同,因此您可以使用任何 %d 或 %i。 但是它們在 scanf() 中的行為不同。
例如:
int main()
{
int num,num2;
scanf("%d%i",&num,&num2);// reading num using %d and num2 using %i
printf("%d\t%d",num,num2);
return 0;
}
輸出:
您可以看到相同輸入的不同結果。
num
:
我們正在使用%d
讀取num
因此當我們輸入010
它會忽略第一個0
並將其視為十進制10
。
num2
:
我們正在使用%i
讀取num2
。
這意味着它將以不同的方式處理十進制、八進制和十六進制。
當它給出num2
010
它會看到前導0
並將其解析為八進制。
當我們使用%d
打印它時,它會打印八進制010
的十進制等效值,即8
。
d
和i
轉換說明符的行為與fprintf
相同,但對於fscanf
行為不同。
正如其他人在他們的回答中所寫的那樣,打印int
的慣用方法是使用d
轉換說明符。
關於i
說明符和fprintf
,C99 基本原理說:
%i 轉換說明符是在 C89 中添加的,以方便程序員使用 fscanf 的 %i 轉換說明符提供對稱性,即使它與 fprintf 一起使用時與 %d 轉換說明符的含義完全相同。
%d 似乎是打印整數的規范,我一直不知道為什么,它們的行為相同。
%d
和%i
都可用於打印整數
%d 代表“十進制”,%i 代表“整數”。 您可以使用 %x 以十六進制打印,使用 %o 以八進制打印。
如果您更喜歡表示“整數”而不是“十進制”,則可以使用 %i 作為 %d 的同義詞。
在輸入時,使用 scanf(),您也可以同時使用 %i 和 %d。 %i 表示將其解析為任何基數(八進制、十六進制或十進制,由 0 或 0x 前綴表示)的整數,而 %d 表示將其解析為十進制整數。
在這里查看更多解釋
正如其他人所說,它們在 printf 上產生相同的輸出,但在 scanf 上表現不同。 出於這個原因,我更喜歡%d
不是%i
。 這是印有號碼%d
可以與讀取%d
,你會得到相同的號碼。 如果您選擇使用零填充,則%i
並不總是如此。 因為將 printf 格式字符串復制到 scanf 格式字符串中是很常見的,所以我會避免%i
,因為它可能會給您一個令人驚訝的錯誤介紹:
我寫fprintf("%i ...", ...);
您復制並寫入fscanf(%i ...", ...);
我決定要更好地對齊列並使字母排序的行為與排序相同: fprintf("%03i ...", ...);
(或%04d
)
現在,當您閱讀我的數字時,10 到 99 之間的任何內容都被解釋為八進制。 哎呀。
如果你想要十進制格式,就這么說。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.