📦 変数・型・演算子
🎯 charが1バイトの小さな整数であることを理解し、文字と数値を相互に変換できる
コンピュータは文字も数として持っています。charは1文字を入れる箱ですが、その正体はとても小さい整数です。
文字は数である
#include <stdio.h>
int main(void) {
char c = 'A';
printf("%c\n", c); // 文字として表示
printf("%d\n", c); // 数として表示
return 0;
}出力は A と 65 です。'A' は文字コード(ASCII)で65番。同じ箱の中身を、%c で見るか %d で見るかの違いしかありません。
覚えておくと便利な番号は3つ。'A' が65、'a' が97、'0' が48です。大文字と小文字はちょうど32離れています。
数として扱えるから計算できる
#include <stdio.h>
int main(void) {
char dai = 'C';
char sho = dai + 32; // 大文字→小文字
char moji = '7';
int suuchi = moji - '0'; // 文字の'7' を 数の7 に
printf("%c %c\n", dai, sho);
printf("%d\n", suuchi * 2);
return 0;
}出力は C c と 14。'7' - '0' は 55 - 48 = 7 です。文字の数字を本物の数値に変えるこの式は、この先いたるところで登場します。
シングルクォートとダブルクォート
・'A' … 文字1つ。char に入る。
・"A" … 文字列。中身は 'A' と終端記号の2つ分(トラック9で扱います)。
別物です。char c = "A"; は型が合わずエラーになります。
動く例——見えない文字にも番号がある
#include <stdio.h>
int main(void) {
printf("[%c] %d\n", 'A', 'A');
printf("[%c] %d\n", 'Z', 'Z');
printf("[%c] %d\n", '0', '0');
printf("[%c] %d\n", ' ', ' ');
return 0;
}最後の行は空白文字です。画面には何も見えませんが、32番という番号がきちんと振られています。
罠・注意
日本語1文字は char に入らない。 UTF-8では「あ」は3バイトです。1バイトの char には収まりません。日本語1文字を扱う話は見た目より複雑で、トラック9で改めて扱います。
char が符号付きかどうかは環境依存。 -128〜127 の環境と 0〜255 の環境があります。128以上の値を char に入れて比較するコードは移植性を失います。
'A' の型は char ではなく int。 Cでは文字定数は int として扱われます。あとで sizeof('A') が 4 になるのを見て驚かないよう、ここで言っておきます。
まとめ
char は1バイトの小さな整数で、文字コードを通して文字を表します。'A'=65、'0'=48、大文字と小文字の差は32。'7' - '0' で数字文字を数値にできます。'A' と "A" は別物、日本語1文字は char に収まりません。
変数に入れられる値の種類と、確保するメモリの大きさを決める分類のこと。箱の形や大きさを決めるルールのようなものだと考えるとよい。int・double・charなど、C言語にはあらかじめ複数の型が用意されている。
もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。