Cの基本2 〜識別子・型〜　備忘録

### はじめに
私は初心者である。この備忘録を参考にされようとしている他の初心者の方は、ここに書かれていることを鵜呑みになさらぬようお願いしたい。何か間違いを見つけた方はコメント欄でご報告頂きたい。

___

### 識別子
変数につける名前のことを識別子という。アンダースコア`_`で始まる語は処理系と名前が被る可能性があるから使用を避ける。先頭は英字に限り予約語は使えない。他にも細かな制約があったが普通に使ってたら気にしなくて良さそうだ。

___

### 数値の定数
`x = 2`でいう`2`の部分。

##### 整数の定数
整数の定数は普通の書くとint型になる。
0で始まる語は8進数とみなされるから、`12`の見栄えを良くしようと0012などと書くと8進数と解釈されてしまう。16進数で書くときは`0x`で始める。

##### 浮動小数点数の定数
普通に書くとdouble型になるらしい。勉強に使っている本には他にもうんちくが載っているが、一生触れることがなさそうな知識なので省略。

___

### 列挙型
ある型に属する値の種類が少なくて限られている時、自分でその型を作る仕組みを列挙型というらしい（意味わからん）。
列挙型は`enum`を使って型が作られる。
例えば
```c
enum sigcolor {red, yellow, green};
```
とすると、`enum sigcolor`という型が作られる。この`enum sigcolor`に`red, yellow, green`が列挙されていることになるらしい。列挙型につけた名前（`sigcolor`）をタグと言い、`red`などは列挙定数と呼ぶ。列挙型自体は変数ではない（？）から、使うときは下記のように宣言する。
```c
enum color {
        red,
        orange,
        yellow,
        green,
        blue,
        violet,　　　　// C99以降は最後の値のあとのカンマもok
    };
    enum color signal;
    signal = red;
    printf("red = %d\n", signal);    
```
outputは、
```c
red = 0
```
列挙型を作ると同時に変数の宣言もできるらしく、
```c
enum color {
        red,
        orange,
        yellow,
        green,
        blue,
        violet,
    }signal;    //　変数の宣言
    
    signal = red;
    printf("red = %d\n", signal);
    return 0;
```
上記でも同じ結果が得られる。

`enum`はなんか分かりにくいから使用例を下記に残しておく。

書籍の問題に
*6つの列挙定数`red, orange, yellow, green. blue, violet`を順にもつ列挙型
`enum color`を宣言して、それぞれの列挙定数が持つ整数値を表示するプログラムを作れ*
というものがあった。私の結果は下記の通り
```c
enum color {
        red,
        orange,
        yellow,
        green,
        blue,
        violet,
    }signal;

    signal = red;
    printf("red = %d\n", signal);
    signal = orange;
    printf("orange = %d\n", signal);
    signal = yellow;
    printf("yellow = %d\n", signal);
    signal = green;
    printf("green = %d\n", signal);
    signal = blue;
    printf("blue = %d\n", signal);
    signal = violet;
    printf("violet = %d\n", signal);
```
出力
```c
red = 0
orange = 1
yellow = 2
green = 3
blue = 4
violet = 5
```
*このプログラムで`yellow`に明示的に`-1`を割り当てると、他の列挙定数はどうなるか？*　
私の回答は以下の通り
```c
enum color {
        red,
        orange,
        yellow = -1,
        green,
        blue,
        violet,
    }signal;

    signal = red;
    printf("red = %d\n", signal);
    signal = orange;
    printf("orange = %d\n", signal);
    signal = yellow;
    printf("yellow = %d\n", signal);
    signal = green;
    printf("green = %d\n", signal);
    signal = blue;
    printf("blue = %d\n", signal);
    signal = violet;
    printf("violet = %d\n", signal);
```
出力は
```c
red = 0
orange = 1
yellow = -1
green = 0
blue = 1
violet = 2
```

___
### 論理型
真か偽かを表す。C99以降で追加。`0`が偽で`1`が真。型の名前は`_Bool`。
他の整数型や浮動小数点数型の数値を論理型に変換すると、その数値が`0`なら`0`、
`0`以外なら`1`となる。以下が例。
```c
_Bool a, b;
    a = 2;
    b = 3;
    printf("%d %d\n", a, b);
```
結果がこのように
```c
1 1
```
`_Bool`はC99以降導入されたものゆえ、真偽値としてはint型を使う慣習が残っているらしい。
`int`と比較すると`_Bool`は以前の規格でコンパイルできなかったり、キーボードで打つのがしんど買ったりする。
`stdbool.h`を`#include`すれば、`_Bool`型が`bool`型として使えるらしく、真偽値も`false`が`0``true`が`1`と定義されるらしい。やってみよう。
```c
// #include <stdbool.h>　をしたうえで
bool a, b, c;
    a = 2;
    b = 3;
    c = false;
    printf("%d %d %d\n", a, b, c);
```
output
```c
1 1 0
```
さて`c`はフォーマットが`%d`じゃなく何か適切なフォーマットであればfalseと返してくれるのだろうか？ささっとググってみても`bool`型のフォーマットというのはなかったな。Cっていうのはこういうとこが面倒なのかな？

今回はこれまで。
ちょっとペースが遅いな。早く起きたい起きたくない

___

>今回の内容は富永和人氏の[新しいC言語の教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84C%E8%A8%80%E8%AA%9E%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%86%A8%E6%B0%B8%E5%92%8C%E4%BA%BA-ebook/dp/B07P1TC98P)を参考に書き留めてます。