61

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

printf("%d", x);printf("%i", x);どちらもx をコンソールに正しく出力します。

これらはどちらも私を同じ場所に連れて行くように見えるので、経験豊富な開発者にどちらが好まれるか尋ねていますか? もう1つは意味的に正しいですか、それとも正しいですか?

4

6 に答える 6

74

と一緒に使用する場合、それらは完全に同等printf()です。個人的には、%dより頻繁に使用されるint.

( と の違いの 1 つは、%i%d一緒に使用するとscanf()%d常に 10 進数の整数を期待するのに対し、 はとの接頭辞を 8 進数と 16 進数として%i認識しますが、どちらにしても使用するまともなプログラマーはいないため、これは問題ではありません。)00xscanf()

于 2013-06-26T20:17:58.397 に答える
23

例の方が理解しやすいと思うので、ここに例を追加しています。

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:

numを使用して読み取りを行って%dいるため、入力010すると最初の値は無視0され、 decimal として扱われます10

num2:

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

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

与えるnum2 010と、先頭0を見て、それを 8 進数として解析します。

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

于 2014-07-04T13:05:47.143 に答える
4

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

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

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

%i 変換指定子は C89 で追加され、fscanf の %i 変換指定子との対称性を確保するためにプログラマーの便宜のために追加されました。

于 2013-06-26T20:27:03.327 に答える
1

%d は整数を出力するための標準のようですが、理由はわかりませんでした。それらは同じように動作します。

于 2013-06-26T20:17:41.627 に答える