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

K3の住民

最近はレア社のゲームについては書いていませんが、一応レア社のゲームが一番好きな人です。『雪圀』で"圀"は"国"とほぼ同義ですが、国ではありませんって当たり前か(笑)。

適当にCの基礎を学ぼう・2

皆さん、どうも雪圀です。ブログでは久々です。
あとあけましておめでとうございます。

Wi-fiが使えないという、謎のアクシデントが起こりしばらく投稿出来ないと
言う状況が年末年始起こりましたが、今は有線で何とかなってます。

ということで、初心者が教えるCの基礎、始まり始まり。

前回の補足

同じくCを習得している兄に低級言語、高級言語について詳しくと指摘された
ので、補足しておきます。
簡単に言うと、低級言語は機械語または機械語を人間でも読めるようにした言語
の総称である。それ以外が高級言語、と呼ばれるものである。
機械語とは、どういうものなのか。先ず機械にとって一番簡単な数の表し方が
二進法である。人間にとって一番簡単な数の表し方が十進法であるように、機械
にも得意が数の表し方がある。それが二進法である。

二進法とは?
0と1の2つの数字で表すことから「二」進法と呼ばれる。そしてそれによる数を
二進数と言う。
数え方としては「0→1→10→11→100→...」と言った感じで数えていく。十進数を
二進数に直すといったのは結構必要だったりするので、覚えておいて損は無い。
因みに十六進法と呼ばれる、0~9まで数えたら、A~Fとアルファベットで表す
16個の数で表すものもある。これも覚えておこう。
二進数から十進数、二進数から十六進数等の楽な変換のやり方は挙げるときりが
無いので別の記事で取り上げようと思う。

機械語は、二進法で表した数字をデータとして並べた言語である。簡単に言えば
機械語を人間でも読めるようにしたのがアセンブリ言語である。それをもっと
分かりやすくしたのが高級言語っていう感じで覚えていただければ良いだろう。
ただ一つ気を付けておくべきなのは分かりやすくした、とは言っても、やること
が制限されている。それは高級の中でも特に高級であれば高級である程、制限
されていく。だから高級言語では制限されているプログラムも自分で組みたいので
あれば、やはり低級言語は必須となる。

文法(続き)

ifやelse、whileでの解説をより良く説明する為にに、それをフローチャート
説明します。これも指摘されましたが、元からそうする予定でしたので。

if文のフローチャートによる解説
先ず前回でのif文の解説に使ったプログラムをフローチャートで表すとこのような
感じになる。
f:id:ryoryoau24:20170111203727p:plain
このように、元はと言えばif文には「そうであった場合」と「無かった場合」で表す
文法であり、「そうで無かった場合」はelseのことを指す。元々ifはelseとセットで
覚えるものである。
では、何故ifだけで表すのか?答えは簡単で、書く必要性が無いからである。ifの条件
に反するとき、何か処理を行いたいといったときにelseを使うのである。何も処理が
無い場合はifだけで良い。
したがってelseの説明に用いたプログラムのフローチャートについては、先程の
画像に処理を一個追加しただけなので、省略する。希望があれば、次回にでも
フローチャートを用いた説明を行う。

while文のフローチャートによる解説
前回のwhile文の解説に使ったプログラムをフローチャートで表すとこのような
感じになる。
f:id:ryoryoau24:20170111211623p:plain
ループ端記号でも表現は出来るが、分かりやすくする為に敢えて判断記号を用いて
解説する。というか、文の中に複雑な処理が無い場合ループ文は判断記号を用いて
表した方が個人的にはより分かりやすくなる。まぁ、後でループ端記号を用いた
フローチャートも用意するけど。
このように、条件に満たしていた場合、処理を一個行い、また条件に帰る、と言った
感じになっている。で、この条件に満たさなければ、処理を行わない、つまりwhile
のループから抜ける、と言う処理になっている。
ここで気づいた方もいるかもしれないが、このwhile文の条件は満たさないとき、
処理を一回も行わない。つまり、while文自体が存在してないも同然になるわけで
ある。これが前判定型ループである。後判定型ループは処理を一回は絶対に行う。
詳しくは後述のdo-while文で紹介する。
最後にループ端を用いて表したフローチャートを以下に示す。
f:id:ryoryoau24:20170111220314p:plain
本当はループ端の終わりに条件に入ってる変数の最後の処理を入れるのだが、処理
を一個も入れないものと勘違いされるかもしれないと思ったのでそれを避ける為に
敢えてこのような図を描いた。本来はc++;の部分がループ端の最後に来る。

do-while文
最後にdo-while文を紹介して終わろうと思う。for文も書きたかったけど、書いて
いたら多分4,5000文字はくだらないだろうと思ったので次回に回す。
do-while文は先ほど書いたが後判定型ループである。その理由を以下のプログラム
フローチャートを用いて説明する。

int main(void)
{
  int c = 1;


  do{      /* 一回は確実に実行する */
    c++;
  }while(c < 5);  /* もしcが5未満であれば、cは加算され続けていく */


  return 0;
}

実はこのプログラム、while文のときのプログラムと全く結果が変わらない。だが、
フローチャートを見れば、while文とdo-while文の違いがはっきりと分かるだろう。
次に、フローチャートを以下に示す。
f:id:ryoryoau24:20170111225443p:plain
これで分かったのでは無いだろうか。while文の場合は条件を目に通してから変数c
を加算するという処理になっているのに対し、do-while文の場合は一回目は目に
通さずcを加算して、ようやく条件に目を通す、といった処理になっているのである。
つまり、ループする条件を後回しにしているのである。以上から、このdo-while文
は後判定型ループと呼ばれている。
このdo-while文は、while(0)にすることで、doだけの処理となる。つまり、複数
の処理を条件も何も無い複合文一個に出来るのである。これが主にどこで使えるか
は・・・マクロ!ご期待ください(またの機会に回します)。


ということで今回は以上です。前回はちょっと中途半端に終わってしまいましたが、
今回はまだマシだと思います。
因みにdo-while文のループ端を使ったフローチャートについては、終了と開始を
逆にしただけなので、省略します。

今回はこれくらいにしときます。