私は独学でCを学びました。なぜなら、%ld
は長い番号のために使うことができると思います。なぜなら、%d
がなぜあるのかわかりませんし、短い方は%hd
などですか?%ldまたは%lldがある場合、なぜ%dまたは%hdを使用するのでしょうか?
また、Cの指定子がどのように動作するのか知りたいのですが、各データ型が範囲を限定しているので、異なる範囲の数値データ型に対して異なる指定子が必要なのはなぜですか?
私は独学でCを学びました。なぜなら、%ld
は長い番号のために使うことができると思います。なぜなら、%d
がなぜあるのかわかりませんし、短い方は%hd
などですか?%ldまたは%lldがある場合、なぜ%dまたは%hdを使用するのでしょうか?
また、Cの指定子がどのように動作するのか知りたいのですが、各データ型が範囲を限定しているので、異なる範囲の数値データ型に対して異なる指定子が必要なのはなぜですか?
見た目では、印刷機能について話していますか?あるいは、同様のパラメータを取る他の関数。
それは例えば、プリミティブ型で行うことです: int
が16ビット未満である数を保持することができます。 long
は32ビットを保持できます。 次に、64ビットを保持できるlong long
があります。
これはすべて、使用しているプリミティブに依存します。プリミティブが保持するビット数を確認するのは簡単です。また、ユーザーが使用するコンピュータが十分強力でないため、いつどこで使用するか注意する必要があります。 Cのいくつかのバージョンには特定のプリミティブがないかもしれないという事実もあります。これは修正されたCシステムの時代遅れになるか、あるいは最適化さえできないかもしれません。
printf(const char *format, ...)
は、フォーマットの後に任意のタイプをとり、任意の数の値を取ります。 int
は、通常、long long
よりも少ない領域を占めます。
printf()
は、format
を使用して、次に続く引数を決定します。指定子が渡された型と一致しない場合は、未定義の動作です。
long long ll = 12345678;
int i = 4321;
printf("%lld %d\n", ll, i); // Format matches the type and count of arguments passed.
// Result: values printed as text as expected
printf("%d %d %d\n", ll, i); // Format mis-matches the type and count of arguments
// Result: undefined behavior
"%hd"
"%hdd"
は別のメカニズムを伴います。 Cは、以前にshort
とsigned char
のような小さなタイプを使用すると、整数のプロモーションからint
まで先行することになりました(いくつかの例外があります)。したがって、printf()
のような関数の場合、short
を渡すと、その値はint
に最初に変換されます。 printf()
は、受信したint
がもともとint
またはshort
であるかどうかわかりません。その場合、次のことはOKです。
int i = 4321;
short s = 321;
printf("%hd %d\n", i, i); // Format matches the promoted type
printf("%hd %d\n", s, s); // Format matches the promoted type
printf()
が"%hd"
に遭遇し、それがint
を受け取ることを期待しますが、内部的に印刷する前にshort
値にそのint
値を変換します。
Google it。あなたは答えを得るでしょう。 – MayurK
'int'を渡すときに'%d'を使用して 'int'を出力します。 'long'を渡すときは'%ld'を使い、 'long long'を渡すときは'%lld'を使います。 '%hd'を使って範囲を' short'の範囲に制限することができます。 'int'は' short'に変換されてから出力されます。 –
大変ありがとうございます、今すぐ取得します –