キャスト
概要
最終更新日:2020/03/01
キャストの基本的な内容、使い方、注意点について書いた記事です。
この記事は以下の内容を知りたい方に向けて書いています。
- キャストとは何か知りたい
- キャストの種類を知りたい
- キャストを使う上で注意することを知りたい
キャストとは
キャストとは型を別の型に変換する機能です。
例えば整数型の変数に実数型の値を代入すると実数型が整数型に変換されます。
キャストには暗黙的なキャストと明示的なキャストがあるので、
このページでは二つのキャストの説明やキャストの注意点の説明を行います。
暗黙的なキャスト
暗黙的なキャストとはプログラム実行時に型が異なる値による
代入、演算が行われる際に自動で行われているキャストです。
// 暗黙的なキャスト
int value = 12.345f;
上のvalueは整数型、12.345は実数型なので暗黙的なキャストが行われます。
結果、12.345の小数点は全て切り捨てられて12がvalueに代入されます。
明示的なキャスト
明示的なキャストとはプログラム実行時に型が異なる値による
代入、演算が行われる際に、コード上で型を変換することを明示するキャストです。
// 書式
(変換する型)値 or 変数名
// 具体例
int value = (int)12.345f;
上のコードで、「(int)」が12.345の前に書かれています。
このキャストで使用している「 () 」をキャスト演算子と呼んでいます。
キャスト演算子により、値をint型にキャストして使用するということが明示され、
12.345の小数点は切り捨てられて、12がvalueに代入されます。
キャストの注意点
キャストでは「計算結果」と「警告(warning)」が問題としてよくあがるので、
それらの説明をしたいと思います。
計算結果
演算では明示的なキャストを使用しないと間違った計算結果になることがあります。
まずは次の整数同士で割り算を行っているコードを読んでください。
int value01 = 3;
int value02 = 2
int result = value01 / value02;
printf("result = %d\n", result);
実行結果:
1
結果が1となっていますが、これはC言語で整数同士の計算を行った場合、
計算結果も整数として扱われる特性があり、小数点は切り捨てられます。
次に整数の型同士を割り算して実数型の変数に代入してみます。
int value01 = 3;
int value02 = 2;
float result = value01 / value02;
printf("result = %f\n", result);
実行結果:
1.0000
結果は1.5にはならず、1のままです。
これは、まず「value01 / value02」の計算が行われます。
この計算でvalue01とvalue02は整数同士なので、計算結果は「1」です。
その結果をfloat型のresultに代入するのでresultには1が保存されます。
もし、計算結果を実数である「1.5」として保存したいなら
明示的なキャストを使用する必要があります。
int value01 = 3;
int value02 = 2;
float result = (float)value01 / value02;
printf("result = %f\n", result);
実行結果:
1.5000
上のコードのようにどちらかを実数型としてキャストすれば計算結果も実数となります。
このようにキャストをすることで、正しい計算結果を出すことができます。
よくあるミス
先ほどのような計算でよくあるミスが以下の内容です。
int value01 = 3;
int value02 = 2;
float result = (float)(value01 / value02);
printf("result = %f\n", result);
実行結果:
1.0000
上のコードではvalue01とvalue02の演算を囲うようにキャストされていますが、
これは演算の結果に対してキャストすることになります。
演算は「整数型 / 整数型」で行われるので、結果は整数型となり、
小数点は切り捨てられます。
その結果を実数型でキャストしても、既に小数点は切り捨てられているので手遅れです。
警告(warning)
VisualStudio等のIDEでは「警告」として
暗黙的なキャストが行われたことを通知してくれます。
上の絵のように問題のソースファイルの名前や該当する行を教えてくれます。
この警告は必ず明示的なキャストを行って消すようにしてください。
なぜかというと、この警告を放置しておくと大量の警告となります。
すると、致命的なバグが発生する可能性のある警告があったとしても
大量の暗黙的キャストに対する警告の中に埋もれてしまい、
本来だったら警告により回避できたバグを見逃すことなります。
このようなことにならないように暗黙的キャストに関する警告は
必ず明示的なキャストを行って消すようにしてください。