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

K3の住民

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

適当にCの基礎を学ぼう

機械 知識

皆さん、久々です、雪圀です。
今日はネタが無いので、もう適当にこれでいいや、と思い、この記事制作に至った
わけです。とは言え、僕も初心者より上程度でしかありませんので、そこはご了承
ください。

ということで、C言語(以降「C」)の基礎について、講座を始めたいと思います。

Cの概要(Cの特徴、歴史)

一応は機械語のような低級言語*1では無く、高級言語ではある。しかし、文法と
しては機械語に近く高級言語の中では比較的複雑であることから「低級に近い
高級言語」等と呼ばれている。だが、自由度が非常に高く、あらゆる分野に
対応出来る言語である(但し、プロセッサ*2の細かい操作をしたいのであれば
アセンブリ言語*3は必要不可欠である)。
JavaJavaScriptのようなインタプリタ言語*4とは違い、コンパイラ(翻訳機
のようなもの)が必要な言語である。したがって、コンパイル(翻訳という
意味)する為のソフトが必要となる。
BCPL言語を元に作られたB言語を元にしたB言語の改良版、と言った感じの言語
で、アルファベッドでBの次がCであったことから、Cと言う名前が付けられた。

Cでプログラミングをするには

先ずはCのパッケージとコンパイルをダウンロードする。ヘッダファイル(関数
が予め入っているファイル)も一応ダウンロードしておく。無料でも良いが、
性能は保証しない。

Cが使える文法

Cを習得してる者ならば、「あれ、先ずは「stdio.h」に入ってるprintf関数
を使った例を出すべきでは?」と思われるかもしれない。しかし、「stdio.h」
が使えないと言う環境も(少数ながら?)存在する為、先ずはCが使える文法
から紹介しようと思う。

その前に必要な知識
フローチャート
フローチャートというのは一言で説明すれば、プログラムの流れである。この
流れはアルゴリズム(プログラミングの理論みたいなもの)の基本中の基本と
なる。フローチャートには様々な図記号があるが、この記事では主に使われる形
だけを覚えてもらおうと思う。表に主に使われる図記号を示す。

表 主な図記号一覧
図記号記号名説明
f:id:ryoryoau24:20161222113645p:plain:right 処理ごく普通のただの処理。判断やループ等の処理以外の処理に使われる。
f:id:ryoryoau24:20161222114710p:plain:right 判断条件文により、分岐する処理に使われる。
f:id:ryoryoau24:20161222125817p:plain:right ループ端ループ処理の開始と終了を表す。判断でもループ処理の流れは表現可能だがこの図記号ではループによる流れ線が必要無い。

これらに流れ線と言う線で繋ぐことで、プログラムの流れが理論的に理解
しやすくなる。
注意点として、流れ線は下に行く際は矢印を書く必要が無いが、それ以外だと
矢印を書く必要がある(まぁ、理論的に考えて当たり前だと思うが)。

データ型
データ型とは、変数の型である。ほとんどが何byte確保出来るかが違うかぐらいの
違いである。

char:1byteの整数。
int:整数。byte数は処理系依存
float,double:浮動小数点実数。floatは4byteの単精度、doubleは8byteの倍精度
      である。小数点がいくつ表示されるかは処理系依存
short,long:整数。shortが2byteで、longがbyte数が多い方だが、処理系依存
unsigned:符号無し。他の型に添えるようにして使う。unsigned char等。

何byte確保できるかは基本的には処理系依存で、どのOSでどのCPUだと何byte
確保されるかは各自で調べる必要がある。しかし、short型、long型を使えば、
ほぼ確実に特定したbyte数を確保できる。但しlongも処理系依存である。また、
全ての型は符号付で、無しにする場合にunsigned型を使う。

演算子一覧
以下に、よく使われる演算記号を示す。但し、+とか、-とか常識レベルの演算子
については無視する。区別する為に変数x,y,z、関数fを使う。なお、はてなブログ
の仕様上+,-,*は全角文字で表すが、本来は全角文字では無く半角文字で入力する
(全角文字はあくまで半角文字と別の文字である為)。

f(x)・・・関数呼び出し演算子。関数fに変数xを代入。
x[y]・・・添え字演算子。配列(また次の機会にやる予定)に使う。
++・・・増分演算子。処理終了前もしくは処理終了後に+1される(詳しくはまた
     の機会にやる予定)。
--・・・減分演算子。処理終了前もしくは処理終了後に-1される。
&x・・・アドレス演算子。ポインタ(また次の機会にやる予定)で使う。
*x・・・間接演算子。ポインタで使う。
~x・・・補数演算子。bitを反転する。
!x・・・NOT演算子。論理を否定する。
(x)y・・・キャスト演算子。int型からdouble型に変換する等、型の変換に使う。
x % y・・・算術演算子の一種。xにyを割った余りが結果として出る。
<<・・・左シフト演算子。bitのシフト(簡単に言えば桁をずらすこと)に使う。
>>・・・右シフト演算子。bitのシフトに使う。
==・・・比較演算子。比較に使うことが出来、条件文でよく使われる。
x & y・・・bit毎のAND演算子。bitのAND演算(またの機会にやる予定)に使う。
x ^ y・・・bit毎のXOR演算子。bitのXOR演算(またの機会にやる予定)に使う。
x | y・・・bit毎のOR演算子。bitのOR演算(またの機会にやる予定)に使う。
x && y・・・AND演算子。AND演算に使う。
x || y・・・OR演算子。OR演算に使う。
x ? y : z・・・条件演算子三項演算子)。return(またの機会にやる予定)の値
      を条件によって変える際によく使われる。
〇=・・・複合代入演算子。〇に様々な算術演算子または論理演算子(後述)
    を当てはめる。どういう意味か説明すると、x += yはx = x+yである。

NOT演算、AND演算、OR演算、XOR演算と出てきたと思うが、これらを論理演算
と言い、これらによる演算子を論理演算子と言う。
Cでの×,÷,≠はそれぞれ*,/,!=で表される。特に!=は他の言語にある<>とは違う
ので注意。

文を作る際の注意
文を作る際にも、様々な記号が必要である。{ }は複合文と言われる奴(複合文以外
にも使うが今は割愛する)で、所謂文の集まりである。条件文、ループ文、関数の
生成等に使われる(因みに複合文に含まれる処理が一つである場合は必要が無い)。
1つの処理には;が使われる。但し、複合文には使ってはいけない。複合文には複数
の処理が含まれているので、してはいけないのである。複合文の中の1つ1つの処理に
;を付けるのがCでのルールである。
また、/* */と言うのもあるが、これはコメントと呼ばれる奴で、この中に
仕様等を書いていく。因みにコンパイルするときにコメントアウトする
(無かったものとして扱われる)為、幾ら記述しても処理速度は全く変わら
ない。
だからどんどん記述していってより分かりやすいプログラムを作ることも出来る。
このコメントで如何に分かりやすいプログラムを書くかがプロになる為の秘訣でも
ある。

if文
ではようやく本題に入ろうと思う。先ずはif文から。
ifとは英語で「もしも」という意味がある。このCでも同じで、「もしこうなった
なら」と言ったときに使われる条件文である。

例えば、int型変数xの初期値が1であったとして、もしxの値が1であったとき、
xの値が5に変更されると言うプログラムを作るとこうなる。

/* if文の例 */


int main(void)
{
  int x = 1;


  if(x == 1)    /* もしxが1であったとき */
    x = 5;   /* xは5になる     */


  return 0;
}

こんな感じ。まぁ、これだと簡単すぎだし意味無いと思うが、基礎なのでその辺
はご愛嬌ってことで。

else
もし先程の処理で変数xの値がif文の条件に合わなければ、どうなるのか。
答えは簡単で、xの値はxの初期値になる。でも何も処理が行われないのも面白く
ない(まぁ、if文での処理も面白くなかったと思うが)。そこで、if文に反した
ときの条件として、elseがある。例えばif文の条件を変えたとして、このよう
にすることが出来る。

/* elseの例 */


int main(void)
{
  int x = 1;


  if(x == 2)    /* もしxが2であったとき */
    x = 5;   /* xは5になる     */
  else     /* もしそうで無ければ */
    x = 255; /* xは255になる    */


  return 0;
}

こんな感じ。このプログラムだとxの値は最終的に255となる。
因みにelseには条件を設定することが出来ない。だが、ifの後にifを入れること
で、ifの条件に合わない場合にも条件を設定することが可能である。
また、if,else以外の分岐を入れたい場合はelse ifを使う。これにより、条件
を三つ以上にすることが可能である。

while文
「無限ループって怖くね?」が出来ることで有名なループ文の一つ。この文法は
前判定型ループで、条件に合わなければ処理が”一度”も実行されないのがこの
while文と後のdo-while文を区別するときの特徴である。
ループの例として、変数cの初期値が1であったとして、cの値が5になるまで
加算され続けていくと言うループを作るとこうなる。

/* while文の例 */


int main(void)
{
  int c = 1;


  while(c < 5)  /* もしcが5未満であれば */
    c++;   /* cは加算され続けていく */


  return 0;
}

こんな感じ。
while文で無限ループを起こす方法だが、これが簡単。なんとwhile()の()の中に
1を入れる。これだけで無限ループが出来る。ね、簡単でしょう?


もう文字数がバンバンなので、続きはまた今度にさせてください。次に紹介
するときはif文やwhile文が分かりにくかった人の為にフローチャートを用意
します。
気軽に作ろうとしたのだが以上に時間がかかってしまった。というか真面目に
見て分かりにくいかもしれない。

間違ってる情報があれば、随時、修正します。

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

*1:低級とは言っても性能が低いとか、安いとかそういうのでは無い。

*2:CPUの別名。

*3:機械語を人間に分かりやすくした言語。

*4:コンパイラが必要無い言語。