=====C++データ型===== C++プログラマーはC言語上では、次の5つの型を使用することができます: void, int, float, double, char。 ^型^説明^ |void|型がないことを表す型| |int|整数| |float|浮動小数点数| |double|倍精度浮動小数点数| |char|文字| これに加えて、C++ではさらに2つの型(bool, wchar_t)が定義されています。 ^型^説明^ |bool|ブーリアン型: true もしくは false| |wchar_t|ワイド文字| ====型修飾子==== 上記の型のうちのいくつかの型は, singed, unsigned, short, longという修飾子を付けることができます。また、これらの型修飾子が単独で使用される場合もあり、その場合はデータ型としてintが指定されたとみなされます。使用可能な完全なリストを以下に示します。同じ意味を持つ型は同じ行に記述されています: ^整数型^^^^ |bool|||| |char|||| |signed char|||| |unsigned char|||| |wchar_t|||| |short|short int|signed short|signed short int| |unsigned short||unsigned short int|| |int|signed|signed int|| |unsigned||unsigned int|| |long|long int|signed long|signed long int| |unsigned long||unsigned long int|| ^浮動小数点数型^^^^ |float|||| |double|||| |long double|||| ^オプションでサポートされる整数型^^^^ |long long|long long int|signed long long|signed long long int| |unsigned long long||unsigned long long int|| ====型のサイズと範囲==== データ型のサイズと、入力できるデータの範囲はコンパイラとアーキテクチャ依存です。[[jp/keywords/sizeof]]演算子を使用することでデータ型のサイズを知ることができます。結果はほとんどの場合はバイト数で表現されます。しかし、多くのアーキテクチャで実装されている、共通の標準的なデータ型のサイズというものがあります。intとfloatは多くの場合32ビット、charは8ビット、doubleは64ビットです。boolは多くの場合は8ビットのデータ型として実装されています。long long型は64ビットです。"cfloat"もしくは"float.h"というヘッダファイルでは浮動小数点数型の範囲を規定しています。整数型に関しては"climits"もしくは"limits.h"というヘッダファイルの中で規定されています。 数字型の限界値はヘッダの中で定義されています。また、[[jp/limits/numeric_limits]]テンプレートを使用すると、C++データ型の、システム依存の数値表現を取得することができるようになります。下記の表の適切な関数を選び、テンプレート引数に知りたいデータ型を設定します。ユーザ定義型に対するnumeric_limitsはオーバーロードできることに注意してください。 ^メソッドもしくは\\ 定数^返り値^説明^ |is_specialized|bool| | |radix|int|指数の底 | |digits|int|仮数の基数の桁数 | |digits10|int|仮数の10進数の基数の桁数 | |is_signed|bool| | |is_integer|bool| | |is_exact|bool| | |min()||負の数を除いて、表現できるもっとも小さい数値 | |max()||表現できるもっとも大きな数値 | |epsilon()||1と1より大きな最小の数の差(表現可能な最小の誤差) | |round_error()||丸め誤差として取り得る最大の値 | |infinity()||あれば、無限大の表現を返す | |quiet_NaN()||浮動小数点数エラーではないが、不正な値| |signaling_NaN()||浮動小数点数エラーを表す、不正な値| |denorm_min()|| | |min_exponent|int| | |min_exponent10|int| | |max_exponent|int| | |max_exponent10|int| | |has_infinity|bool| | |has_quiet_NaN|bool| | |has_signaling_NaN|bool| | |has_denorm|_denorm_style| | |has_denorm_loss|bool| | |is_iec559|bool|IEC-559規格に準拠しているか? | |is_bounded|bool| | |is_modulo|bool| | |traps|bool| | |tinyness_before|bool| | |round_style| float_round_style列挙型| (訳注)丸め方の方法。GCCでは以下の5つが定義されています \\ round_indeterminate \\ round_toward_zero \\ round_to_nearest \\ round_toward_infinity \\ round_toward_neg_infinity| このテンプレートは主に、データ型が保持できる最大値と最小値の数値を見て、境界のチェックをするのに使用されます。下記のコードは、プログラムを実行しているシステムにおける、short型の最小値と最大値を表示します: #include std::cout << "Maximum short value: " << std::numeric_limits::max() << std::endl; std::cout << "Minimum short value: " << std::numeric_limits::min() << std::endl; ====型宣言を読む==== シンプルな型宣言を理解するのは簡単です: int i しかし、以下のような複雑な型宣言を読み解くのは簡単ではありません: double **d[8] // おや? char *(*(**foo [][8])())[] // うわ!fooって何だ!? 上記の宣言を理解するには以下の3つのルールを使用します: - 変数名から見始めます。上記の例の場合は、''d''と''foo''になります - 最後にデータ型を見ます。上記の例の場合は、''double''と''char''です - 右側に見に行けるときは右に見ていきます。カッコがついていて左にしか行けない場合には左に見ていきます サンプル: ^表現^意味^ | ''double %%**%%d[8];'' | | | ''double %%**%%d[8];'' | **dはdouble型** ... | | ''double %%**%%d[8];'' | dはdouble型 **を8個持つ配列** ... | | ''double **d[8];'' | dはdouble型を8個持つ配列 **へのポインタ** ... | | ''double %%**%%d[8];'' | dはdouble型を8個持つ配列へのポインタ **へのポインタ** | もっと複雑な例: ^表現^意味^ | ''char *(*(%%**%%foo [][8])())[]'' | | | ''char *(*(%%**%%foo [][8])())[]'' | **fooはchar型** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型 **の配列** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列 **を8個持つ配列** ... | | ''char *(*(**foo [][8])())[]'' | fooはchar型の配列を8個持つ配列 **へのポインタ** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列を8個持つ配列へのポインタ **へのポインタ** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列を8個持つ配列へのポインタへのポインタ **を返す関数** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列を8個持つ配列へのポインタへのポインタを返す関数 **へのポインタ** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列を8個持つ配列へのポインタへのポインタを返す関数へのポインタ **の配列** ... | | ''char *(*(%%**%%foo [][8])())[]'' | fooはchar型の配列を8個持つ配列へのポインタへのポインタを返す関数へのポインタの配列 **へのポインタ** | もっと詳しく知りたい場合には、[[http://www.unixwiz.net/techtips/reading-cdecl.html]]にある、Steve Fried氏が書いた「どのようにCの宣言を読むか」というすばらしい説明を参照してみてください。