【初心者向け】プログラミングにおける文の構造について
はじめに
この記事では、静的型付けの言語に大まかに共通する文法をベースに、初学者が理解しておくと学習がスムーズになるであろう考え方をお伝えします。自分自身深く理解しているとは言えないので、誤った表現も見られるかもしれません。お気づきの際はぜひご連絡していただけると幸いです。
突然ですが、以下のコードをご覧ください。
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