アルファベット等の文字は内部的には数字で表現されているという話を聞いたことがあると思います。
文字が数字で表現されているから、その値(数値)を増やしたり減らしたりすることで、画面に出力する文字を変えることができるという理屈になります。
なお、この話はchar型が小さな整数値を扱えるという話ともリンクしています。
以上のことをコードで再確認してみました。
#include <stdio.h> int main(void) { char c; for (c = 'A'; c <= 'Z'; c++) printf("%c ", c); printf("\n"); for (c = 'a'; c <= 'z'; c++) printf("%c ", c); return 0; }
コードの実行結果は以下のとおりです。
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
このコードでは、char型の変数「c」に文字(「A~Z」と「a~z」)を代入しています。この際、「c++」 でインクリメントできていることから、内部的に数値として扱われている匂いが漂っていますね^^。
同じことをint型の変数を利用して行ってみます。
#include <stdio.h> int main(void) { int i; for (i = 0; i <= 25; i++) printf("%c ", 'A' + i); printf("\n"); for (i = 0; i <= 25; i++) printf("%c ", 'a' + i); return 0; }
コードの実行結果は以下のとおりです。
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
このコードでは、printf文の中で最初のアルファベット(A または a)にint型の数値「i」 を足しています。足す数値を「 i++」 で大きくすることによりprintf文で出力されるアルファベットが変化していますね。
具体的には、
A + 0 は A A + 1 は B A + 2 は C
という感じで Z まで続いています。
このことからも、文字(ここではアルファベット)と数値がリンクしていると言えそうです。
今度は、アルファベットをASCIIコード(数値)で出力してみましょう。
やることはフォーマット指定子を %c から %d に変えるだけです。
(%3d の 3 は3桁幅で出力するためのものです)
#include <stdio.h> int main(void) { char c; printf("A~ZのASCIIコード\n"); for (c = 'A'; c <= 'Z'; c++) printf("%3d ", c); printf("\n\na~zのASCIIコード\n"); for (c = 'a'; c <= 'z'; c++) printf("%3d ", c); return 0; }
このコードの実行結果は以下のとおりです。
A~ZのASCIIコード 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 a~zのASCIIコード 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
この結果から、
A + 0 は A A + 1 は B A + 2 は C
というのは、以下のようになっていたと分かります。
65 + 0 は 65 // これが A 65 + 1 は 66 // これが B 65 + 2 は 67 // これが C
念のため、再確認。
#include <stdio.h> int main(void) { char c = 'A'; printf("AのASCIIコードは %d ", c); return 0; }
このコードを実行すると
AのASCIIコードは 65
と表示されました。
余談
アルファベットのASCIIコードを出力した際、大文字と小文字の差が「32」でしたね。
A → 65 a → 97 Z → 90 z → 122
ということは、32を加えたり差し引いたりすることで、大文字を小文字に変換したり、小文字を大文字に変換したりできそうです。
ただ、C言語にはtoupper関数やtolower関数があるので、そちらを使えば済む話ですが。(これらの関数を使う場合は、ctype.hをインクルードする必要があります。)