ブログ

覚えて損するわけがない!マジC言語解説~変数編~

 

work-731198_1920

 

こんにちは!武田塾垂水校の講師Iです。
自分がここでよく「勉強に役立つかもしれないゲームプログラミング」という記事を書いているのですが、最初は超やんわりやるつもりだったんですけど段々とガチで解説している感じになってしまいました。
そこで懸念点として挙がったのが「順序がちゃんとしていないから初心者がこんなの見て付いてこれるわけなくね?」という点です。
なのでC言語を理解するためだけに別の記事(メモ書きみたいなの)を用意して、分からないところがあったらそっち見ればいいじゃない!と思ったのでこの記事を書き始めました。

まあ今の時代スマホもかなり普及しましたし仕事でデジタルに触れない人間はほぼいないと思うので情報系を目指している方は勿論、そうでない方も知っていて損はしない内容になっていると思います。
もしかすると普通の仕事にはJavaやPython等別のプログラミング言語の方が良いかもしれませんが、それらを習う上でもC言語を知っておくと感覚がつかみやすいかもしれません。
因みに自分はC言語の感覚に振り回され過ぎてJavaは全然使いこなせませんでした。(ダメじゃん)

それでは早速解説していきます。

 

まず変数って何?

「勉強に役立つかもしれないゲームプログラミング」を見てる方は知っているかもしれませんが、多分本編で書いてないことも多いと思うので復習がてら見ていってください。

変数というのは大雑把に言うと「何かを持っておくことが出来るデータ」です。
これに数字を入れて計算させたり文字を入れて出力させたりとプログラミングでいろんなことをやるための基礎になるものです
そして変数にはいろんな型があり、それぞれに何が入るのかは決まっています。

型名 バイト長 簡単な説明
int型 2~8byte 整数を入れることが出来る型。小数も一応入れることは出来るが小数点以下が切り捨てられる。
float型 4byte

小数を入れることが出来る型。小数型は下のdouble型もあるが基本こっちでいい。

double型 8byte

同じく小数を入れることが出来る型。三角関数等小数点以下が長いことになりそうなやつで使う。

char型 1byte

文字を入れることが出来る型。だけど実際に文字をぶち込んでるわけじゃない。(後述)

bool型 未検証

真か偽かを入れることが出来る型。正直変数かどうかは怪しいが使うことはまああるし一応入れた。

最初に知っておくべき型はこのくらいです。ここから各項目の説明に移ります。

 

いやバイト長って何?

さて、各種型名の説明に移る前にバイト長の説明をします。

バイト長というのは簡単に説明しますと「その型名を使用するのに必要な容量」です。

例えるなら穴埋め問題を例に挙げると分かりやすいのではないでしょうか?
3文字しか入らないところに4文字も入ってしまったら問題にならないですよね?
穴埋め問題にもその問題に適した穴の数を用意するのと同様に、プログラミングの変数にもそれぞれに適した容量があるのです。

その容量の説明のついでに1bit、1byteについても説明をしておきましょう。

bit(ビット)というのはメモリやストレージの最小単位で、1bitには0か1しか入れることが出来ません

これに関しては聞いたことがある人もいるかもしれませんが全てのデータは0か1で出来ています
その0か1を1つずつ持つのがこのbitなんですね。

そして皆さんもよく聞くであろうbyte(バイト)というのは1bitが8個で出来る単位です。8bit=1byteです。

皆さんがよく聞くのは「GB(ギガバイト)」とか「MB(メガバイト)」だと思いますが、あれも1byteが何個も集まってできたデータの単位です。ここの詳しい説明については後でします。

 

さて、8bit=1byteと言いましたがここで1つ質問です。
この1byteを使って数字(正の整数)を1つ覚えるとするとどのくらい大きな数字を覚えることが出来るでしょうか?

つまり8つの0または1の数字を使って何通りの数字を表現できるのか?という質問です。
高校で数学の勉強をしていた人なら分かると思いますが2進数の問題ですね。
1bitにつき0か1の2通りを表現でき、それが8個あるので2の8乗で256通りですね。
なのでこの1Byteを「正の整数しか入らない条件」で使うと256まで入ることになります。

これを例えばint型(整数型)で見てみましょう。上の表を見ると2~8byteと書いてますがデフォルトでは4byteです。
4byteなら1byteの4倍の容量を使えるのですから256の4乗です。4294967296通りですね。
符号なし指定(正の整数のみ)なら0~4294967295まで、デフォルトの符号付き指定(負の整数も込みで)なら-2147483648~2147483647まで入れることが出来ます。凄いですよね。

これをより実感しやすいのが同じ小数型のfloatとdoubleですかね。doubleはfloatの2倍容量を食っている分floatよりも正確な数字を入れることが出来ます。
また、逆にそこまで大きい数字を使わないなら容量節約のために1つ下の容量の型を使うのもアリですね。

 

さて、おまけに「GB」とか「MB」について軽く説明しますが、
1Byteが約1000個集まると1KB(キロバイト)、KBが約1000個集まると1MBになります。

ということは1GBだと1MBが約1000個集まっていることになる訳ですね。
因みに何故「約1000個」と言っているのかというと、具体的には1000個ではないからです。

結論から言ってしまうと正確には2の10乗=1024個なのです。2進数好きですね。
それをキリ良く1000と言ってしまっている訳ですね。なので「1GBは1000000000(10億)Byteかあ~」とか思っていた人もいるかもしれませんが実際はもうちょっとあります。(1024×1024×1024=1073741824Byte)

 

そしておまけのついで、SI接頭辞についてです。
まあキロとかギガのことです。自分も名前に関しては今知りました。
SIというのは国際単位系というそうです。へーほー。
因みに由来はフランス語らしいけどフランス語の記号の打ち方知らないしwikiからコピペも怖いので気になる人は調べてください。

10の何乗か 10³ 10⁶ 10⁹ 10¹² 10¹⁵ 10¹⁸ 10²¹ 10²⁴
単位 M G T P E Z Y
読み方 キロ メガ ギガ テラ ペタ エクサ ゼタ ヨタ

ここでは大きい単位だけを挙げてみました。PCストレージの単位がペタになることを祈って覚えておきましょう。
逆に小さい方が気になる方は自分で「SI接頭辞」と調べてください。

それでは、かなり逸れてしまいましたが型名の解説です。

 

オーソドックスな整数型、int型

文字通り整数(integer)を入れることが出来るint型の解説です。
とは言え上の表の説明で難しいことはほぼOKなんですが…

まずはint型の変数の作り方ですね。滅茶苦茶簡単です。

int a;         //aという名前の変数を作る

unsigned long long int a;

//int型の場合のみint型特有の型指定を行うことが出来る

これの黒字の部分だけでint型の変数を作ることが出来ます。簡単ですね。
そして変数を作ることをプログラミング用語で「宣言する」と言います。
ここでは「a」という名前で作ってますが、

・他の変数と名前が被らない
・数字を1番前に持ってこない(後ろとかはOK…なはず)

等のルールを守っていればなんでもいいです。
そして勘の良い方は気付いているかもしれませんが「int」の部分を他の型名にすると他の型名の変数を作ることが出来ます。簡単ですね。

あとはセミコロン(;)ですが、これは1つ1つの命令の最後に必ず付けましょう。これ付けてなくてエラー吐くのは初心者がよくやりがちなミスです。

因みにバイト長の説明でも少し触れましたがint型だけはバイト長を変更することが出来ます。
やり方は宣言の前に謎の呪文を入れるだけです。
呪文の種類は「signed(符号付き)」「unsigned(符号無し)」「short(小さい)」「long(とか言ってるけど普通)」「long long(大きい)」の5種類です。
「符号が付いているのか」「大きさはどのくらいか」の順番で書いてからint型の宣言をするとバイト長を変えることが出来ます。
因みに何も書かないと「signed long(符号付きの普通サイズ)」になります。逆にデフォルトで符号が付いているので「signed」と書く必要はないです。
まあこれに関しては「そんなことが出来るんだ」くらいの理解度でいいです。

 

次は実際に数値を入れてみましょう。

a = 10;          //aに10を入れる

// int a = 10; と書くと宣言と代入が同時に出来る

これで数値を入れることが出来ます。変数に数値を入れることを「代入する」と言います。
更に注釈にも書いていますが、宣言と今回の代入を1つのコードで同時にすることも出来ます。便利ですね。

ここで1つ注意点ですが、「=」を挟んで左のものに右のものを代入します。
なので10 = a;などと書いてしまうと「10は変数じゃないよ」とエラーが出ます。

まだ気を付けるべき点がもう1つありますが、それは比較演算子というものを使う時に言います。

 

最後にこれを使って四則演算をしてみましょう。

a = 2 + 3;          //2+3の答えをaに代入

a = 5 - 2;           //足し算、引き算は普通に行う

a = 2 * 5;          //掛け算は「×」を使わず「*」を使う

a = 8 / 4;          //割り算は「/」を使う

四則演算をする場合、算数で使っている一部の記号が使えません。
なので「*」(アスタリスク)「/」(スラッシュ)を使います。
スラッシュに関しては分数などでおなじみですが、アスタリスクはあまり見慣れないと思うので頑張って慣れてください。

この他にも特殊な計算や、応用的な使い方もあります。

a = 5 % 2;          //aに「5を2で割った余り」を入れる

a = 2 * (4 - 1);   //()内の計算は先にする

int a = 2 + 3;     //変数を宣言と同時に計算

int b = a * 2;     //計算に(既に宣言している)変数を使用

int a = 2.5;       //小数を入れると小数点以下が切り捨てられる

int a = 5 / 2;     //割り算の結果でも同様に小数点以下切り捨て

こんな感じで色々出来ます。

ここで1つ注意点ですが小数点切り捨てと%はint型固有の性質なのでint型でしか使えません
(%が他の型でも使えたかちょっと怪しいです…まあ使わない方が無難でしょう。)
逆にこれら以外の部分は変数全てでほぼ共通しているので是非覚えましょう。

では結構長くなっちゃってますが小数型の説明に移ります。

 

2つの小数型、float型とdouble型

それでは小数型の説明をしようと思いますが基本的な性質はint型とほぼ一緒です。
なのでfloat型とdouble型の違いと注意点だけ羅列していこうと思います。

まずfloat型とdouble型の違いについてはdouble型の方が容量が倍多いです。
(まあバイト長の表に書いてますけど)

なのでdouble型の方が円周率等小数点以下が長い小数を記憶することが出来ます。
逆にそんな細かい小数を入れないor記憶する必要がない場合float型を使います。

そしてこの2つの小数型の注意点ですが警告が割と出やすいです。

実はdouble型とfloat型を混同したりするとエラーは吐きませんが警告を出すことがあります
エラーならともかく警告は無視して構わないので無視しましょう。
この警告がよく出るのが三角関数とか使う場合ですね。あの関数を使用すると大体double型になるのでfloat型と一緒に計算して警告がわんさか出るなんてことが結構あると思います。ソースは私。
同じ現象にあった場合は何もしなくて大丈夫です。それでエラーが出るようなら別のところでエラーが出ていると思います。

あとはint型の説明にも書いていますが、int型にしか出来ないことは当然小数型には出来ないのであしからず。

宣言とかもintの代わりにfloatとかdoubleを使えばいいだけなので小数型の説明は終わりです。
では次にchar型の説明に入ります。

 

文字が入ってしまう⁉char型

char型とは1byteで1つの文字を入れることが出来る…訳ではないんです。
それは何故かをこれから説明しますが…その前に上のバイト長の話を思い出していただきたい。

1byteに8bit入ってその1bitずつに0か1が入る…なんて話でしたね。
では果たして1byteに文字を入れるなんてことが出来るのでしょうか?
答えはNoです。8個の数字でアスキーアートを書くわけにもいきませんからね。
ですが、文字のパターンを数字で入れることは可能です。

そこで使うのが文字コードってやつです。

文字コードというのは「数字毎に表現する文字を決めたシステム」のことです。
(定義に関してはざっくり覚えているのでちょっと違うかも)
その文字コードを参考にして数字の羅列をPC側で文字にしよう、ってわけです。

ということは…char型に入っているのは1byte分の数字な訳です。
なので実は計算とかも出来ちゃいます。(負の数や小数が入る計算は除く)

まあそんなことより文字を入れる方法の方が知りたいと思うので早速解説していきます。

char a = 'A';        //文字を「'」で挟むと

                         //その文字に対応した数字が入る

                         //(ここではaに65(Aの文字コード)が入る)

こんな感じで文字を入れることが出来ます。

因みにこれ入るの一文字だけなので(漢字とかになるともっと容量要ります)何文字も入れたかったら
その文字数分char型を作らないといけません。
それの簡単なやり方は次の次くらいの記事で解説します。

そしてchar型の注意点ですが、先ほども言いましたが数字としても使えてしまう点です。

char型に入っている数字を文字として扱う場合と数字として扱う場合があるのでそれを間違えると数字が変わって別の文字になってしまったり文字を表示してほしいのに数字が出てきたりします。

ですがまあ特定のコード以外では基本的に数字として扱われるのでchar型を使う時には気を付けましょう。

それでは長くなりましたが最後にbool型の解説です。

 

他の奴らとは一味違う⁉bool型

bool型(boolean)と言うのは論理型と言われている「true(真)」か「false(偽)」のみを返す変数です。
主な使い方としては条件による分岐等スイッチみたいな感じで使います。
分かりやすく例えるなら「スイッチをオンにしてる時だけ明かりがつく」みたいな感じですね。

他の変数とは違って数字として扱うことが出来ないので変数と言っていいのか自分は分かりませんか使い方は変数とほとんど同じなのでここでは変数として扱います。

まあ宣言とか定義はint型と全く一緒です。
ですが入れるものが大分違います。

bool b = true;        //trueかfalseを入れる

bool f = 1;            //数字も一応入れることは出来る

この様にtrueかfalseを基本的に入れます。
さっき試してみると数字を入れることも出来ましたがC言語だと正常に数字を読み取ってくれないのでやめておくことをお勧めします。

そしてここからがbool型の面白いところなのですが、数字は正常に読み取ってくれないと言いました。
ですが数字を真か偽で判別することは出来ます。

いやどういうこっちゃ?となると思うので具体例を載せておきます。

bool b = 0;          //この場合bにはfalseが入る

bool b = 1;          //この場合bにはtrueが入る

こんな感じで数字の代わりにtrueかfalseを入れてくれます。
判別基準は0だったらfalse、0以外だったら負の数でも小数でも何でもtrueという感じです。
(さっき雑にvisualstudioで調べてみたらこんな感じでした)

このbool型の大まかな使い方は冒頭で説明したとおりですが具体的な使い方は別の記事にするつもりなのでそちらを見てください。

途中から急ぎ足になりましたがこれで今回の解説を終わります。

 

最後に

超絶スパルタ授業part1お疲れさまでした!

まさか変数をまとめるだけでこんなに書くことになるとは思いませんでした…。
今回書いたことはプログラミングにおける超基礎事項なのでプログラマーになりたいって人は必ず覚えておいてください!
次の記事では今回の最後に保留してしまったbool型の具体的な使い方についてやる…と思います。

それでは!

垂水校では無料受験相談を実施中


勉強でお悩みの受験生の方に向け

無料受験相談を実施しております。

「勉強方法が分からない」

「志望校の決め方が分からない」

「志望校合格に必要な勉強時間が知りたい」

など、お気軽にご相談下さい。

 

無料受験相談

あなたに合った勉強法を教えます!

無料受験相談に行ってみる