簡體   English   中英

%i 或 %d 使用 printf() 在 C 中打印整數?

[英]%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總是期望一個十進制整數,而%i00x前綴識別為八進制和十六進制,但沒有理智的程序員無論如何都使用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

di轉換說明符的行為與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 表示將其解析為十進制整數。

在這里查看更多解釋

為什么 %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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM