2章　C言語　変数と型

#2.0 あいさつ
こんにちは！
この記事では、変数と型についてか～な～り端的に書いていきます。
間違いに気付いたらお教えください。

#2.1 変数宣言
前章の最後の方で、main関数についてふれましたがそこにでてきた<font color="red">文</font>の内、変数宣言の文がありましたよね？

```c:test.c
#include <stdio.h>
int main(void)
{
    // 変数宣言の文
    int nogizaka;
    // 計算・そして代入の文
    nogizaka = 46;
    // 命令実行の文
    printf("乃木坂%d",nogizaka);
    return 0;
}
```

```
実行結果
　乃木坂46
```

この変数を宣言することによって、ものをいれるための<font color="red">箱</font>を作ります。変数を宣言するときは、
　　　型 変数名；
のように必ずスペースをあけてください。
この箱に値をいれることを<font color="red">代入</font>、取り出すことを<font color="red">取得</font>と言います。

``1. 変数宣言時の注意事項``
名前を付けるときに注意事項があります。
* 予約語は使えない
<dd> int , void , return など </dd>
* 先頭に_を1つ付けた名前は使用できない
<dd> C言語自体のために予約されている（予約語）
詳しく↓
>予約語について
キーワードについて→[BohYoh.com](http://www.bohyoh.com/CandCPP/C/keyword.html)
予約識別子について→[JUGEM](http://portable-c.jugem.jp/?eid=10)
　　　　　　　　　→[JIS X 3010:2003](http://kikakurui.com/x3/X3010-2003-01.html)
</dd>

* すでに利用している変数名は付けない
<dd> 例えば~~いくら乃木坂が好きでも~~nogizakaという名を複数回使うことはできません </dd>
* 大文字/小文字、全角/半角は区別される
<dd> nogizaka と Nogizaka は、まったくの別物 </dd>
* 小文字で始まるわかりやすい名前が望ましい
<dd> C言語自体のために予約されている（予約語）</dd>
<dd></dd>

``2. 代表的な型``

 型名 　　| 格納するデータ | 利用頻度 
------|-------------- | ------
 char |  とても小さな整数         |  普通
 short |  小さな整数         |  普通
 int |  普通の整数        |  くっそ使う　めちゃくちゃ使う
 long |  大きな整数     |  普通
 float |  少しあいまいでもよい小数         |  普通
 double |  普通の小数      |  普通
 bool |  true か false      |  めちゃくちゃ使う
 char |  半角の文字     |  くっそ使う　めちゃくちゃ使う
※1. charは、整数と文字のどちらでも使えますが、基本的には文字列として使いましょう。
※2. unsigned型(マイナスを考えない)というのもありますが、まあスルーでもいいでしょう。

<dd></dd>

``3. オーバーフロー``
　格納可能な上限値を超える値を変数に代入しようとすることを<font color="red">オーバーフロー</font>と言います。普通ほかの言語だとエラーで怒ってもらえるんですけど、C言語だと想定外のことをしてぶっ壊れます。気をつけてください。

#2.2 初期化と定数

```c:test.c
#include <stdio.h>
int main(void)
{
    int nogizaka;
    printf("乃木坂%d",nogizaka);
    return 0;
}
```

```
実行結果
　乃木坂11029
```

なにがいけなかったのでしょうか。
→→正解は、"int nogizaka;"のあとに"nogizaka"に何も代入していないことです。
このように新しく定義した変数に対して何かを代入しない場合予期せぬことが起こります。それを防ぐためにあらかじめ数値を代入しておく必要があります。これを<font color="red">初期化</font>と言います。

```c:test.c
#include <stdio.h>
int main(void)
{
    int nogizaka;
    nogizaka = 46;
    // もしくは、下記のようにまとめても良い
    // int nogizaka = 46;
    printf("乃木坂%d",nogizaka);
    return 0;
}
```

```
実行結果
　乃木坂46
```

#2.3 上書きと定数について
まずは、以下のプログラムを見てください。

```c:test.c
#include <stdio.h>
int main(void)
{
    int nogizaka = 46;
    int singleNum = 21;
    printf("乃木坂%d、%dndシングル ジコチューで行こう！\n",nogizaka,singleNum);
    nogizaka = 22;
    printf("乃木坂%d、%dndシングル 帰り道は遠回りしたくなる",nogizaka,singleNum);
    return 0;
}
```

```
実行結果
    乃木坂46、21ndシングル ジコチューで行こう！
    乃木坂22、21ndシングル 帰り道は遠回りしたくなる
```

まあここまで大げさに書けばわかると思いますが、"nogizaka" に22を代入していますね。このように箱の中身を最初に定義した値から変えたい場合<font color="red">上書き</font>を行います。これにより中身を変更することは可能です。
しかし、想定では"nogizaka" は変えず "singleNum" を変えたかったはずです。このように想定外の部分で変更されたくないときは、<font color="red">定数</font>として扱いましょう。定数を宣言するときは、
　　　<font color="blue">const</font> 型 変数名；
のように宣言します。
そうすれば定数定義した変数について代入を行おうとするとエラーになります。（想定外の変更が起きなくなります）

※　列挙定数（知っておくと便利かも）
↑でintを複数定義しましたが、いっぺんに定数として作ることができます。

```c:test.c
#include <stdio.h>
int main(void)
{
    enum{ ASUKA, NANASE, IKUTA, TAKAYAMA};
    printf("%d %d %d %d\n", ASUKA, NANASE, IKUTA, TAKAYAMA);

    enum{ MINAMI = 10, MIONA = 15, YODA = 30, AKIMOTO = 50};
    printf("%d %d %d %d", MINAMI, MIONA, YODA, AKIMOTO);
    return 0;
}
```

```
実行結果
    0 1 2 3
    10 15 30 50
```

#2.4 文字列について
文字列についてですが、<font color="red">非常</font>に面倒です。
↑でcharどうのこうの言いましたが、とりあえずは以下の1文(おまじない)書いてことを進めましょう。

```c:
    typedef char String[1024];
```

ざっくりですが例を書いておきます。

```c:test.c
#include <stdio.h>

typedef char String[1024];

int main(void)
{
    String idolName = "乃木坂";
    int nogizaka = 46;

    printf("%s%d", idolName ,nogizaka);
    return 0;
}
```

```
実行結果
    乃木坂46
```

注意事項

``1. 初期化を除き、＝で代入してはいけない``
上記で上書きやら代入やらしましたが、Stringに対してはダメです。危険です。

```c:
    String nogizaka = "乃木坂";       //OK
    String keyakizaka;
    keyakizaka = "欅坂";              //ダメ、初期化じゃない
    String nogizaka = keyakizaka;    //ダメ、初期化のようだけど変数
```

``2. ↑のおまじないは絶対にそのまま``
~~いくら乃木坂が好きだからって~~1024→46にするなど数字を変更するのはだめです。

``3. %sについて``
ソース中の"%s"は文字の置換用です。数字用の"%d"と間違わないようにしてください。

#2.5 bool型について
主に条件分岐として使います。のちにでてきますがif文というもので使用するためです。
こちらも面倒なのですが定義が必要です。

```c:
    #include <stdbool.h>
```

まあtrue(真)とfalse(偽)の方が直感的でわかりやすいですよね。定義があるのですが、中身を見てみるとこのようになっていました。

```c:
    #define bool _Bool
    #define true 1
    #define false 0
```

サンプル下記です。if文は少し予習として書いておきます。

```c:test.c
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int nogizaka = 46;
    bool nogi_flag = true;
    if( nogi_flag ){
        printf("私達、乃木坂%dです", nogizaka );
    }
    return 0;
}
```

```
実行結果
    私達、乃木坂46です。
```

以上。