読者です 読者をやめる 読者になる 読者になる

プログラミング初心者に「プログラムとは何か」をなんとなく説明するブログ

第1章 「変数?いえ、知らない子ですね」

「変数を制するものはプログラミングを制す。古事記にもそう書かれている」

プログラミングを始める上で変数の理解は避けて通れません。これは変数とはなんぞや、を振り返ります。もう知ってるわ!って人は読まなくてもよいです。さっさと自習してください。

変数とは何か

プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。一人一人の人間が異なる名前によって区別されるように、一つ一つの変数も名前によって区別される。これにより、複数のデータを容易に識別することができる。変数を区別するための名前を特に識別子という。また一般に、変数が表しているデータをその変数の値(あたい)という。(Wikipediaより)

これだけ読んでもなんのこっちゃだと思うので、とりあえず以下のソースコードを見てみてください。ちなみに今後のテキストで書くコードは全てSwiftです。

もうちょい説明しますね。

プログラムが主に行う操作は主に3つあります。

  • 宣言
  • 代入
  • 参照(この章では説明しません。ワイがはっきり教えられる自信がないので今後も説明するか分かりません)

宣言とは、ソースコードの1行目、2行目、5行目にあたります。

var a: Intという一文は「Int型の箱にaという名前をつけてプログラムの世界で使えるようにする」という意味があると思ってください。

同様にvar b: Intも「Int型の箱にbという名前をつけて使えるようにする」です。

ちなみに「型」とはSwiftで扱うデータの種類を表します。プログラミング言語によって少しずつ異なっていますが、Swiftにおいて代表的なものは以下です。

  • String型:文字列専用の箱
    • var name: String
  • Int型:符号付整数専用の箱
    • var a: Int
  • Double型:浮動小数点専用の箱
    • var c: Double
  • Bool(Boolean)型:真(YES)か偽(NO)か
    • var tensai: Bool
  • Array型(ここでは説明しません)
  • Dictinary型(ここでは説明しません)

改めて、「var a: Int」とは「aという名前の段ボール箱を用意するよ!その中には符号付の整数を入れるよ!」とパソコンに対して宣言するということになりんす。

代入はその名の通り、段ボール箱にものを入れる作業になります。

では a = 3 と書くとどういう意味になるでしょうか??

「aという段ボール箱に3というInt型の数値を入れる」ということ。まぁそんな感じです。b = 2も同様ですね。

数学の世界で「=」は左辺と右辺が等しいことを表す記号ですが、プログラミングの世界では左辺の変数に右辺のものを代入する、ということを表すということを覚えておいてください。数学のイコールとは明確に意味が違います。これが代入です。

では、5行目では何をやっているのか。宣言と代入を一緒に行っています。

「resultという箱を用意したよ!中にaとbを足したものを入れる(代入する)よ!」ということ。

変数が数値型の場合、変数は四則演算が可能です。そのため、resultの箱の中身は5になります。

最後、「var name: String = "nakajima"」の意味はわかるでしょうか??

Int型の時と同様に「nameという箱にnakajimaという文字を入れるよ!」ということになります。

ただし、文字列型は数値型と四則演算はできないので、

result = name + a とかやるとエラーで怒られます。

では、変数を使って簡単に底辺:10、高さ:4の三角形の面積を求めるプログラムを書いてみます。変数名がクソかっこ悪いのは仕様です。

var teihen: Int = 10
var takasa: Int = 4
var menseki = (teihen * takasa) / 2

xcodeのplaygroundでこのコードを書くと20と表示されるはずです。

プログラミングではこんな感じで宣言、代入、(参照)を繰り返しながらプログラムに実行してほしいことを書いていくことになります。

var と letの違い

変数の宣言の方法は2つ

var a: Int = 3
let b: Int = 3

var か letかの違いですね。

varとletは変数が「可変」か「不変」かの違いです。

var(可変)で宣言すれば、一度段ボール箱に値を入れた場合でも、新たに値を入れて上書きすることができます。

var a: Int = 3
a = 5

このソースコードでは3を代入した後、5を代入しているので、現在のaの中身は5になります。

かわって、let(不変)は読んで字の如く値が変化しません。というか変化させられません。一度入れたら段ボール箱が捨てられるまで中身が変わらないということです。

let b: Int = 3
b = 5

こういうコードを書こうとすると2行目でxcodeちゃんに怒られます。

xcode「不変の箱に入れたら変更できないの!全くグズなんだから!」

そういうことです。

letはどういうときに使えばいいのか、それは原則変化がない値を宣言するときに使用すればよいのです。当たり前っちゃあ当たり前なんですが。

例えば円周率。ワイは3.14で習ったのでこれで固定します。円周率が他人によって3140に書き換わってしまったら大問題です。可変で宣言したワイが怒られます。なのでletで宣言してあげれば誰かが違う値を代入しようとしてもxcodeちゃんが怒ってくれます。素敵ですね。 後はほとんど変化がない値でもよく使います。例えば消費税はletで宣言して法改正に合わせて値を変える、みたいな運用です。

以上を踏まえてa, bを使って2つの円の面積を求めてみます。

let pai = 3.14
var hankei = 10
var menseki = hankei * hankei * pai

hankei = 1
menseki = hankei * hankei * pai

一度宣言したhankei, mensekiという変数を再利用しています。

実はこのソースコードでは今までと少し変わった書き方をしましたが、気づいた方はいますかね??

先ほどの例ではデータ型の宣言をしていません。

let pai: Double = 3.14
let pai = 3.14

この二つのコードはどちらも同じ意味になります。xcodeちゃんは頭が良いので、右辺を見てどのデータ型なのか自動で判別してくれます。なので「: Double」の部分が省略できるのです。素敵。まぁでも慣れないうちはデータ型を指定してあげましょう。

こういう概念的なものってやっぱり漫画にすると分かりやすかったりするんですよね。

ということで、 manga.crocro.com

このページも参考にしてみてください。題材はjavaですが基本は同じです。

本日はここまで。お疲れさまでした。

最後に

「変数とは箱である」という説明はプログラミング初心者向けに説明するときによく用いられる表現なのですが、厳密には正しくありません。正しくないわけでもないんですが、正確に表現しているわけじゃないんですね。説明しろと言われてもだいぶ困っちゃいますが、、、

「変数は箱じゃない」vs 「変数は箱でええやろ」論争も今も巻き起こってます。僕自身は初学者に対しては「変数は箱」派でいいと思っています。ただ、そのうち「変数って箱じゃなくね・・・?」と思い始める日がくるはず。そうなったらクソザコからだいぶレベルアップしてきた証拠になると思っております。

短くまとめるつもりがだいぶ長くなってしまった・・・

ここまでお読みいただきありがとうございました。