2016-12-22 3 views
-4

私は独学でCを学びました。なぜなら、%ldは長い番号のために使うことができると思います。なぜなら、%dがなぜあるのかわかりませんし、短い方は%hdなどですか?%ldまたは%lldがある場合、なぜ%dまたは%hdを使用するのでしょうか?

また、Cの指定子がどのように動作するのか知りたいのですが、各データ型が範囲を限定しているので、異なる範囲の数値データ型に対して異なる指定子が必要なのはなぜですか?

+0

Google it。あなたは答えを得るでしょう。 – MayurK

+1

'int'を渡すときに'%d'を使用して 'int'を出力します。 'long'を渡すときは'%ld'を使い、 'long long'を渡すときは'%lld'を使います。 '%hd'を使って範囲を' short'の範囲に制限することができます。 'int'は' short'に変換されてから出力されます。 –

+0

大変ありがとうございます、今すぐ取得します –

答えて

0

見た目では、印刷機能について話していますか?あるいは、同様のパラメータを取る他の関数。

それは例えば、プリミティブ型で行うことです: intが16ビット未満である数を保持することができます。 longは32ビットを保持できます。 次に、64ビットを保持できるlong longがあります。

これはすべて、使用しているプリミティブに依存します。プリミティブが保持するビット数を確認するのは簡単です。また、ユーザーが使用するコンピュータが十分強力でないため、いつどこで使用するか注意する必要があります。 Cのいくつかのバージョンには特定のプリミティブがないかもしれないという事実もあります。これは修正されたCシステムの時代遅れになるか、あるいは最適化さえできないかもしれません。

0

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は、以前にshortsigned 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値を変換します。

関連する問題