私はただCを学んでおり、iOSの開発に手を出しているためObjective-Cについて少し知識がありますが、Objective-Cでは変数を出力するためにNSLog(@"%i", x);
を使用していましたxしかし、コンソールではいくつかのCチュートリアルを読んでおり、%d
の代わりに%i
を使用するように言っています。
printf("%d", x);
およびprintf("%i", x);
の両方は、コンソールにxを正しく出力します。
これらは両方とも私を同じ場所に連れて行っているようですので、経験豊富な開発者にどちらを好むのですか?もう1つの意味的に正しいですか、または右ですか?
printf()
とともに使用した場合、これらは完全に同等です。個人的には、%d
の方が好きです。これはより頻繁に使用されます(「int
の慣用的な変換指定子」と言うべきでしょうか?)。
(%i
と%d
の違いの1つは、scanf()
と共に使用すると、%d
は常に10進整数を期待するのに対し、%i
は0
と0x
プレフィックスを8進数と16進数として認識しますが、気にしないプログラマーは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進数の10
として処理されます。
num2
:
num2
を使用して%i
を読んでいます。
つまり、10進数、8進数、16進数の扱いが異なります。
num2
010
を指定すると、先頭の0
が表示され、8進数として解析されます。
%d
を使用して出力すると、8進数の010
に相当する10進数の8
が出力されます。
d
およびi
変換指定子は、fprintf
と同じ動作をしますが、fscanf
の動作は異なります。
他の人が答えで書いたように、int
を印刷する慣用的な方法はd
変換指定子を使用しています。
i
指定子とfprintf
に関して、C99 Rationaleは次のように述べています。
Fscanfの%i変換指定子との対称性を提供するために、fprintfで使用される%d変換指定子とまったく同じ意味を持ちますが、プログラマーの利便性のために%i変換指定子がC89に追加されました。
%d
と%i
の両方を使用して整数を出力できます
%dは「10進数」を表し、%iは「整数」を表します。 %xを使用して16進数で印刷し、%oを使用して8進数で印刷できます。
「10進数」ではなく「整数」を指定する場合は、%iを%dの同義語として使用できます。
入力では、scanf()を使用して、%iと%dの両方を使用することもできます。 %iは、任意のベース(0または0xプレフィックスで示される8進数、16進数、または10進数)の整数として解析することを意味し、%dは10進整数として解析することを意味します。
詳細についてはこちらをご覧ください
%dは整数を印刷するための標準のようです。私は理由を理解することはありませんでした。
他の人が言ったように、printfでは同じ出力を生成しますが、scanfでは異なる動作をします。この理由から、%d
より%i
の方が好きです。 %d
で印刷された数字は、%d
で読み込むことができ、同じ数字が得られます。ゼロパディングの使用を選択した場合、%i
では常にそうとは限りません。 printf形式の文字列をscanf形式の文字列にコピーするのが一般的であるため、%i
を避けることができます。これは、驚くべきバグの紹介になる可能性があるためです。
fprintf("%i ...", ...);
と書く
fscanf(%i ...", ...);
をコピーして記述します
列をよりきれいに整列させ、アルファベット順をソートと同じように動作させることにしました:fprintf("%03i ...", ...);
(または%04d
)
今、あなたが私の数字を読むとき、10から99の間の何でも8進数で解釈されます。おっと。
10進フォーマットが必要な場合は、そう言います。