🌳

【初心者向け】プログラミングにおける文の構造について

に公開

はじめに

この記事では、静的型付けの言語に大まかに共通する文法をベースに、初学者が理解しておくと学習がスムーズになるであろう考え方をお伝えします。自分自身深く理解しているとは言えないので、誤った表現も見られるかもしれません。お気づきの際はぜひご連絡していただけると幸いです。

突然ですが、以下のコードをご覧ください。

bool flag = true;
if (flag) {
	//TODO
}

プログラミングを学び始めた方が上記のコードを見たとき、「え?」と思う場合が多いかもしれません。その場合、「if文って、大なり、小なりとかイコールとかの条件式を使う必要があるんじゃないの?」と思ったのだと思います。しかし、そうと決まっているわけではありません。多くの言語の文法仕様では、

if (真偽値) {
	実行する文章
}

のように定まっているわけで、かっこの中の式が最終的に真偽値(true または false)として「評価」されるなら問題ないのです。では、「式を評価する」とはどういうことでしょうか?

式、評価とは

まず、「式」とは、以下のようなものを指します。

1 + 2
x * y
x == z
x != w
Sum(x)
x

ここでは1行に1つずつの式を記載しました。これらのような式は、実行時にその都度「評価」されて、その結果となる値に置き換えられます。つまり、「評価」とは簡単に言い換えればその式を計算し、その式が存在した部分を結果の値に置き換えることです。また、単に値をぽつんと書いてもそれは式なので、上記のif文の例では、

bool flag = true;
if (flag) {
	//TODO
}

if (flag == true) {
	//TODO
}

のようなコードにおいて、どちらのif文もエラーにならず実行されます。比較演算子を用いた式は、trueかfalseのどちらかに値が評価されるので、

flag
flag == true

はどちらも、trueとなり、同じ値なのです。
つまり、

bool型の値 == true

と条件式を書くことは、 (可読性を高める場合に必要である場合もありますが) 不要ではあるということになります。

その他の例

int Sum(int x, y, z) {
	return x + y + z;
}

int a = Sum(1, 5, 10);

このコードでも先ほどの例と同様、Sum(1, 5, 10) が評価されてaに代入されます。つまり、aには16が代入されます。また、

int k = 10
int a = 1024 * k

のような宣言はエラーになると思ってしまう方がたまに見られますが、これはエラーになりません。

int[][] a = new int[][]{
	new int[]{1, 2, 3},
	new int[]{4, 5, 6},
	new int[]{7, 8, 9},
}
//a[0][2]を出力
Console.WriteLine(a[0][2])

上記のようなコードで二重配列を定義したとき、「何が出力されるんだろう...?」と迷ってしまうこともあるかもしれませんが、これも同じことです。

Console.WriteLine(a[0])

のように一つの配列を出力させるとわかりやすいはずです。
aはint型の配列を格納する配列です。また、aの0番目に格納されている配列は 1, 2, 3なので、その2番目は3となります。また、宣言を行っている部分についても

型名[]

の形で配列の型を表現できるとき、

int[][]

はint型の配列の配列、つまり二重配列になることが分かると思います。

おわりに

他人の書いたコードを見ているときに、「これ、どういうこと?」と思ってしまうような書き方があるかもしれません。多くの初学者の場合、その疑問はこの記事によって解決されると思います。言語による差異・知らないとわからない独自の記法などはもちろん存在します。しかし、どんなに複雑に見える式も、値がどんどん評価されていった結果にしかなり得ないので、そのことを意識しながらコードを読むことが理解につながるはずです。

Discussion