挨拶
今回も新・標準プログラマーズライブラリ C言語 ポインタ完全制覇 を教本に学習を進めて行きます。今回は 式(Expression) について学習していきます。教本に沿って学習を進めますが、事実と異なる部分があればご指摘いただけるとありがたいです。
式とデータ型
一次式
教本によるとこれは以下のものを指すとあります。
- 識別子(変数・関数名)
- 定数
- 文字列リテラル
- 式を()で囲んだもの
読み進めて行くと、どうやら"式の要素に使えるもの"を表しているようです。
どういう意味かというと、
int hoge = 10;
int x = 5;
printf("hoge + x = %i\n",(hoge + x) / 5);
結果
hoge + x = 3
このようなコードの場合hogeとxはリストで言うところの識別子に該当し、printf関数内にて()で囲み、5で割っている部分が式を()で囲んだものに該当します。
//識別子
int hoge = 10;
int x = 5;
//式を()で囲んだもの
printf("hoge + x = %i\n",(hoge + x) / 5);
これを指して一次式と呼んでいるようです。
なぜこれが重要なのか?
これが重要なのは、あらゆる式には型があるということです。
これは関数を例に上げるとわかりやすそうです。
例えば以下のような関数を定義したとします。
int sum(int x,int y){
return x + y;
}
この関数を呼び出して使う際の引数はint型でなければなりません。
sum(10,5);
結果
x + y = 15
また、printf関数を使用する際、第一引数に文字リテラル(ダブルクオーテーションで囲まれた部分)を渡しているのもこれが理由です。
printf("hoge + x = %i\n",(hoge + x) / 5);
printf関数はstdio.hにおいて、第一引数の型はcharへのポインタと定められています。
printf (const char *__restrict __fmt, ...)
そのため、第一引数にint型の変数や計算結果を渡すとコンパイルエラーになってしまいます。
(第一引数が文字列リテラルのため、以下のコードは問題なく使用できます)
(コメントにて、"以下のコードはchar型の配列(char[8])なのでポインタ型とは異なる"とご指摘いただきました。まだ勉強不足で適切な例を出せず申し訳無いです...)
printf("Hello!\n");
少し話がそれてしまいましたが、要は変数や関数の引数には必ず型があるのだから、それに合わせないとエラーになるということです。(当たり前)
最初に書いた1次式は、このことを説明するためのものだと思います。
このあたりは他の言語でも同じかと思います。(型推論に関してはどう処理しているのかわかっていません...)