web-dev-qa-db-ja.com

printi()を使用してcに整数を出力する%iまたは%d?

私はただCを学んでおり、iOSの開発に手を出しているためObjective-Cについて少し知識がありますが、Objective-Cでは変数を出力するためにNSLog(@"%i", x);を使用していましたxしかし、コンソールではいくつかのCチュートリアルを読んでおり、%dの代わりに%iを使用するように言っています。

printf("%d", x);およびprintf("%i", x);の両方は、コンソールにxを正しく出力します。

これらは両方とも私を同じ場所に連れて行っているようですので、経験豊富な開発者にどちらを好むのですか?もう1つの意味的に正しいですか、またはですか?

44
Dummy Code

printf()とともに使用した場合、これらは完全に同等です。個人的には、%dの方が好きです。これはより頻繁に使用されます(「intの慣用的な変換指定子」と言うべきでしょうか?)。

%i%dの違いの1つは、scanf()と共に使用すると、%dは常に10進整数を期待するのに対し、%i00xプレフィックスを8進数と16進数として認識しますが、気にしないプログラマーはscanf()を使用しないためです。 )

50
user529758

例を理解しやすくするため、ここに例を追加しています。

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;
}

出力:

enter image description here

同一の入力に対して異なる結果を見ることができます。

num

%dを使用してnumを読み込んでいるので、010を入力すると、最初の0は無視され、10進数の10として処理されます。

num2

num2を使用して%iを読んでいます。

つまり、10進数、8進数、16進数の扱いが異なります。

num2010を指定すると、先頭の0が表示され、8進数として解析されます。

%dを使用して出力すると、8進数の010に相当する10進数の8が出力されます。

18
A.s. Bhullar

dおよびi変換指定子は、fprintfと同じ動作をしますが、fscanfの動作は異なります。

他の人が答えで書いたように、intを印刷する慣用的な方法はd変換指定子を使用しています。

i指定子とfprintfに関して、C99 Rationaleは次のように述べています。

Fscanfの%i変換指定子との対称性を提供するために、fprintfで使用される%d変換指定子とまったく同じ意味を持ちますが、プログラマーの利便性のために%i変換指定子がC89に追加されました。

3
ouah

%d%iの両方を使用して整数を出力できます

%dは「10進数」を表し、%iは「整数」を表します。 %xを使用して16進数で印刷し、%oを使用して8進数で印刷できます。

「10進数」ではなく「整数」を指定する場合は、%iを%dの同義語として使用できます。

入力では、scanf()を使用して、%iと%dの両方を使用することもできます。 %iは、任意のベース(0または0xプレフィックスで示される8進数、16進数、または10進数)の整数として解析することを意味し、%dは10進整数として解析することを意味します。

詳細についてはこちらをご覧ください

%dが整数を表す理由

1
Priyatham51

%dは整数を印刷するための標準のようです。私は理由を理解することはありませんでした。

1
Stephan

他の人が言ったように、printfでは同じ出力を生成しますが、scanfでは異なる動作をします。この理由から、%dより%iの方が好きです。 %dで印刷された数字は、%dで読み込むことができ、同じ数字が得られます。ゼロパディングの使用を選択した場合、%iでは常にそうとは限りません。 printf形式の文字列をscanf形式の文字列にコピーするのが一般的であるため、%iを避けることができます。これは、驚くべきバグの紹介になる可能性があるためです。

fprintf("%i ...", ...);と書く

fscanf(%i ...", ...);をコピーして記述します

列をよりきれいに整列させ、アルファベット順をソートと同じように動作させることにしました:fprintf("%03i ...", ...);(または%04d

今、あなたが私の数字を読むとき、10から99の間の何でも8進数で解釈されます。おっと。

10進フォーマットが必要な場合は、そう言います。

0
David Roundy