c言語におけるデータ型への配慮
今までpythonしか触ったことがなく、最近になってc言語の勉強を始めたのだがデータ型への配慮が足りなくて、ケアレスミスを起こした。自分への戒めとしてここに記事にしておく。
c言語では異なるデータ型同士で演算を行うときにはキャストが行われ、片方のデータ型に変換が行われる。
変数やオブジェクトを宣言する時に定義した型とは型の方に変換することを型変換という。型変換には明確に記述しないでも自動で行われる_暗黙的型変換_と_明示的型変換(キャスト)_がある。
暗黙的型変換では基本的に型の精度が高い方に合わせられるが、商を求める場合などでは、暗黙的型変換が行われない場合があり、その場合望んだ結果が得られない場合がある。そこで、エラーを避けるためにキャスト(明示的型変換)を行う。
これには明確なランクがある。ランクも重要であるが今回私の犯した間違いはそこではないので割愛する。
型変換はchar型にも対応しており、int型からchar型に型変換することもできる。また、ポインタ型へのキャストもある。ポインタについては現在勉強中なので、ポインタについての記事を書いた時にそちらの方で説明できればと思う。
混合演算の勉強過程で以下のようなコードを書いた。
main()
{
char c1, c2, c3;
int i1, i2, i3;
float f1, f2, f3;
c1 = 'x';
c2 = 1000;
c3 = 6.02e23;
printf("%c %c %c\n", c1, c2, c3);
i1 = 'x';
i2 = 250;
i3 = 6.02e23;
printf("%c %c %c\n", i1, i2, i3);
f1 = 'x';
f2 = 14;
f3 = 1.603e19;
printf("%c %c %c\n", f1, f2, f3);
}
```
このコードの実行結果は以下のようになる。
```
x \350 \300
x \372 7
� � 7
Program ended with exit code: 0
```
このコードの間違いはフォーマット指定子が全て%cになっておりcharにしか対応できなくなっている点にある。
正しいコードは以下のようになる
```diff_c
main()
{
char c1, c2, c3;
int i1, i2, i3;
float f1, f2, f3;
c1 = 'x';
c2 = 1000;
c3 = 6.02e23;
printf("%c %c %c\n", c1, c2, c3);
i1 = 'x';
i2 = 250;
i3 = 6.02e23;
printf("%d %d %d\n", i1, i2, i3);
f1 = 'x';
f2 = 14;
f3 = 1.603e19;
printf("%f %f %f\n", f1, f2, f3);
}
```
実行結果は
```
x \350 \260
120 250 989593624
120.000000 14.000000 16029999923671859200.000000
Program ended with exit code: 0
```
となる。
これは1行目が全て文字型(char)、2行目が整数型(int)、3行目が浮動小数点型(float)で表されている。
ちなみに、全て正しいフォーマット指定子で出力してあげると以下のようなコードと結果になる。
```diff_c
main()
{
char h1;
int h2;
float h3;
h1 = 'x';
h2 = 1000;
h3 = 1.603e19;
printf("%c %d %f\n", h1, h2, h3);
}
```
```
x 1000 16029999923671859200.000000
Program ended with exit code: 0
```
参考URL
https://www.sejuku.net/blog/25737