c++ - 書式付きIO関数の変換指定子%iと%dの違いは何ですか(* printf / * scanf)


printf書式指定子として使用されたときの%d%iの違いは何ですか?


Answers



出力のために使用されるときは同じです(たとえば、 printf

ただし、入力指定子として使用する場合は、例えば%dが整数を符号付き10進数としてスキャンする場合は異なりますが、 %iデフォルトで10進数になりますが、16進数( 0xが前にある場合)および8進数( 0が前にある場合)も可能です。

したがって、 033%iでは27、 %dでは33になります。




これらはprintfと同じですが、 scanfとは異なります。 printf場合、 %d%i両方が符号付き10進整数を指定します。 scanf場合、 %d%iは符号付き整数を意味しますが、 %iは、 0xが前に付いている場合は16進数、 0が前にある場合は8進数を0xし、そうでない場合は10進数として解釈します。




printf%i%d書式指定子には違いはありません。 これは、 C99規格草案 7.19.6.1にも書かれています7.19.6.1 関数も書式指定子に関するprintf7.19.6.1 ます。これは段落8で述べています。

変換指定子とその意味は次のとおりです。

次の箇条書きを含んでいます:

d,i     The int argument is converted to signed decimal in the style
        [−]dddd. The precision specifies the minimum number of digits to
        appear; if the value being converted can be represented in fewer
        digits, it is expanded with leading zeros. The default precision is
        1. The result of converting a zero value with a precision of zero is
        no characters.

一方、 scanf場合、 %dはベース10を仮定し、 %iはベースを自動的に検出します。 これを見るには、 7.19.6.2fscanf関数を参照してください7.19.6.2 関数は、書式指定子に関してscanf7.19.6.2ます。

変換指定子とその意味は次のとおりです。

以下を含みます:

d     Matches an optionally signed decimal integer, whose format is the
      same as expected for the subject sequence of the strtol function with
      the value 10 for the base argument. The corresponding argument shall
      be a pointer to signed integer.

i     Matches an optionally signed integer, whose format is the same as
      expected for the subject sequence of the strtol function with the
      value 0 for the base argument. The corresponding argument shall be a
      pointer to signed integer.



これらの言葉には何もない - 二つは同義語です。