前回はプロジェクト「0020_keisan」のソースコードを使って、int型とfloat型の変数の宣言や初期化の方法、足し算を計算するプログラムを書きました。
今回は、別の代表的な変数である char 型についてみていきましょう。どちらの変数もゲーム制作に限らずどんなプログラムを組んでも頻繁にお世話になるかと思います。 bool 型は後ほど条件文をお話しした後に書きますので、ここでは放置しておきたいです。
この記事は前回のつづきですので、前回を読んでる前提で書いてます。
ではでは char 型を取り扱うサンプルのプログラムを作成していきましょう。 プロジェクト「0030moji」を新しく用意して、プロジェクトに空の「Moji.c」を追加し、下のソースコードをコピペして動かしてみましょう。 プロジェクトの新規作成は[過去の記事](/blog/201806howtoaddnewprojectto_visualstudio/)をご参照ください。
#include <stdio.h>;
int main( void )
{
char lunch = 'A';
printf("ぷらんく:お金がないのでお昼は %c ランチにします\n", lunch);
printf("店のオヤジ:まいど!%c ランチは「小麦スープ」だぜ!\n" ,lunch);
lunch = lunch + 2;
printf("ぷらんく:えっ、言い間違えました、%c ランチでした\n", lunch);
printf("店のオヤジ:・・・\n");
}
実行すると、下のような結果になったと思います。
ぷらんく:お金がないのでお昼は格安 A ランチにします
店のオヤジ:まいど!A ランチは「小麦スープ」だぜ!
ぷらんく:えっ、言い間違えました、C ランチでした
店のオヤジ:・・・
では一行づつ見ていきましょう。
4行目で、char 変数名 = 変数に設定する値;
という書き方が登場します。
前回、「int 変数名 = 整数;」 という似たようなプログラムを書きました。 ちなみに、4行目は下の2行に分解できます。
char lunch = 'A';
char lunch;
lunch = 'A';
分解後で見たほうが、一行の意味はシンプルでわかりやすいですね。
char lunch; ですが、この lunch は char型の変数で宣言 されており、 以降、char型にあった数値やら文字やらを入力できる、という意味になります。
そして、lunch = 'A'; ですが、 変数 lunch に1文字だけ「A」を入力する、という意味になります。
実際には英文字や数字、一部記号なども数字(もっといえば 0 と 1 の組み合わせ)でメモリ等の中で管理されており、 「'A'」という書き方は文字「A」をコンピュータが取り扱うための整数に変換して、変数lunch に入力してね。という意味になります。
英文字・数字・記号 ⇔ 整数の変換表は「ASCIIコード表」と呼ばれ、C言語以外のコンピュータ全般で今でも非常に広く使われています。 この記事の末尾にASCIIコード表を書いておきますね。
このASCIIコード表をみてもらうと、A という英字 1文字は整数の「65」に変換されます。 つまりコンピュータ上では A という英字は実際には 65 という数字で扱われてるという意味です。
これは最初から lunch に整数 65 を入力しても、同じ結果になるということです。
実際に次の行に書き換えて見てください。同じ結果になったかと思います。なるといいな。
char lunch = 65;
さきほどの4行目で、char型は1文字を入れることができるとお話したかと思います。 もし、上のソースコードで char 型に 'あ' とか試した方は、ただしく画面上に文字がでなかったかと思います。 「・」みたいな感じで文字がうまく表示されていません。正しい数字 ⇔ 日本語文字が変換できず、文字化けという現象が起こってしまっています。
ぷらんく:お金がないのでお昼は格安 ・ ランチにします
じつは日本語の一文字はプログラム上、2文字だったり3文字だったりで取り扱われるような仕組みとなっています。確実に1文字として入るのは ASCIIコード表に書いてある、英文字や数字、記号などです。
詳しい話は別の機会にするとして、簡単にお話すると、 char型は 0~255 の整数しかもてない作りになっています。日本語は種類もおおくて、この整数の種類だけでは表現できないのです。ですので、 char を複数個使って一文字を表現することになっています。
そして、 char = 'あ' とか書いてしまうと、1文字に入りきらずに溢れてしまい、結果としてうまく表示できないことになってしまいます。
ちゃんと日本語を扱うための方法がありますので、次の記事で、日本語を表示するときの変数への代入方法をかきますね。
次の行にすすみます。
printf("ぷらんく:お金がないのでお昼は %c ランチにします\n", lunch);
printf("店のオヤジ:まいど!%c ランチは「小麦スープ」だぜ!\n" ,lunch);
実際にプログラムを動かした方であれば、新しくでてきた「%c」の役割はなんとなく想像がついているかもしれませんが、「%c」は整数をASCIIコード表上の1文字に変換して表示する変換指定子となります。
以前は整数を %d 、浮動小数点数(小数)を %f で表示していたかと思います。その種類の一つとなります。
%c の c は Character(訳:文字)の頭文字だと思います。 英単語と結びつけると覚えやすいですね。よく使うものだけでも覚えておくと便利だとは思います。
次の行にすすみます。 実際にゲームプログラミングでこんなプログラムを書いたらわかりずらいので、ここのプログラムはあくまで仕組みを理解するためのものです。
lunch = lunch + 2;
この行は見ての通り足し算の計算をしています。 でも計算に独特のルールがあるので、基本を覚える必要があります。
右辺の計算結果が左辺の変数に代入される ので、まず右辺を見てみましょう。
「lunch + 2」とあります。変数 lunch にはこの時点で 'A' が代入されていましたね。
'A' というのは整数の 65 です。
つまり変数 lunch には整数 65 が入っているので右辺は「65 + 2」となり、足し算の結果「67」となります。ここで、右辺の結果を踏まえてみると、 lunch = 67; をしていることになります。
この行は「変数 lunch に 2 を足す」という処理をしたことになります。
次の行で char 型で整数の計算をした結果を表示しています。
やっているのは、5~6行目と同じです。
printf("ぷらんく:えっ、言い間違えました、%c ランチでした\n", lunch);
結果は C ランチになってましたでしょうか。
この時点で変数 lunch には整数 67 が入っています。 「%c」で1文字を表示するとき、整数 67 に相当する文字を ASCII コード表のルールに従って表示しています。
ASCII コード表のルールでは整数 67 は文字「C」になるため、このような結果になったのでした。
今回はここまで。お疲れさまでした。
次回は日本語の文章(文字列)を変数として宣言したり使ってみたり、をお話したいと思います。
このASCIIコード表ですが、0~126の整数と変換される文字・記号・数字などを表しています。0~31までは 制御文字と呼ばれるもので、たとえば整数の 7 は「ベルを鳴らす」という特殊文字をつかったプログラムはこんな感じです。
char tokusyumoji=7;
printf("特殊文字を表示してみよー!文字=「%c」", tokusyumoji);
実行しても画面上に文字の中身はでないとおもいます。でも、動かす環境によっては「ぴーーッ!」とか、なにやら、パソコンからまずそうな音が鳴ったかもしれません。
特殊文字はそれぞれ、特別な条件や特殊なデータ、プログラム上で使うように設計されていたりします。このシリーズでは、制御文字は「0(NULL)」「10(改行コード)」「13(復帰コード)」くらいしか利用しないと思います。(実はすでにいままでのプログラムでも内部では使われていたり・・)
それ以外の特殊コードの詳細はここではご説明しませんが、ASCIIコード表自体は必要なときにこのページに立ち戻って確認できればよいな、と思っています。
char型という一文字表示するための型についてお話しました。それだけでもだいぶ長くなってしまいました。
今回はここまで。お疲れさまでした。
更新日 | 更新内容 |
---|---|
更新なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: