C言語ことはじめ 1日目: はじめてのC言語

# <i class="fa fa-pencil fa-x"></i> C言語ことはじめ

これからC言語について学んでいく経過をまとめていこうかと思います。
基本的に「独習C」( http://www.amazon.co.jp/%E7%8B%AC%E7%BF%92C-%E3%83%8F%E3%83%BC%E3%83%90%E3%83%BC%E3%83%88-%E3%82%B7%E3%83%AB%E3%83%88/dp/4798102962 )に沿って学習していく事になります。
現在の自分のレベルは、Rubyの基本的なコードを理解することができ、C言語は苦しんで学ぶC言語(書籍版)に一度目を通したところです。

それでははりきって行きましょう <i class="fa fa-star"></i>

## <i class="fa fa-pencil fa-x"></i> C言語の基本形

```
戻り値の型 関数名(仮引数名)
{
  # 素晴らしいコード
  return 0;
}
```
上記が最も基本的なC言語の定義になります。
決まりごとがいくつかあるので箇条書きで上げていきましょう。

* C言語は複数のサブルーチンを持つ事ができますが、main()関数は省く事はできません
* main()関数はプログラムの実行開始点です
* main関数の`{`から`}`までプログラムが進むと、終了します
* 引数が無い場合は、仮引数名のところに`void`と書きます


## Cプログラムのコンパイル、実行
注）Mac環境では恐らくgccを用いることになると思うのですが、コンパイルする際は、必ず拡張子を`.c`にしてください。`C++`のファイルもコンパイルできるようになっているために、拡張子が`.cpp`などになっているとコンパイルエラーが起きてしまいます。

① `$ gcc -o hello hello.c`

ターミナルで上記のコマンドを実行すると、`hello.c`がコンパイル、リンクされ、オブジェクトファイルである`hello`が作成されます。
コンパイル前のファイルを**ソースファイル**、コンパイル後の実行可能ファイルを**オブジェクトファイル**と呼びます。
C言語はコンパイルの過程が必要なので、構文エラーがあれば基本的にそこでコンパイルは停止します。しかし、C言語は**弱い型付け言語**であるために変数の型まではチェックしてくれません。
これがのちのちランタイムエラーに関わってくることもあるでしょう。

② `./hello`

これでオブジェクトファイルを実行することができます。


## C言語での変数
C言語は静的な型付け言語です。よって、変数を用いる際に変数の型を宣言する必要があります。


|  型 |　変数名  |
|  ------- | ------- |
|   文字| char |
|   整数| int  |
|整数(符号無し)| unsigned int|
|   浮動小数点| float  |
|   浮動小数点(倍精度)| double  |
|   値無し|void  |

データサイズ別にもっと変数の型はありますが、以上の物が基本的な変数になります。
桁数の多い小数点はdoubleを使う事になるのですが、マシンレベルが向上した今の時代にfloatとdoubleのデータサイズの違いが問題になるケースは少なくとも自分には見当がつきません、基本的にdoubleで問題ないでしょう。

intよりもっと桁数がもっと大きくなるときはlongなどの型もありますが、intの時点で2^32(4294967296個の整数、-2147483648～2147483647)個の整数を表現できるので、サンプルプログラムを書いているうちはこちらも問題ないでしょう。


## C言語での変数、定数


### 変数宣言
変数に値を代入したい時は、以下のようにコードを書きます。
`int x, y, z;`
ここでは整数型の変数を３つ宣言しました。
変数名にはアルファベットの大文字小文字、0~9の数字、アンダースコアを使う事ができますが、**大文字小文字は区別される**ことに気をつけましょう。
また変数を宣言する際は、**基本的に関数内で宣言**します。そうでないと、グローバル変数として扱われてしまいます。
C言語でのローカル変数も、スコープはその変数を宣言した関数の中でだけになります。

### 変数代入
`counter = 100;`
宣言後、変数には値を再代入することができます。
`int counter = 100;`
このように、宣言と同時に代入することもできます。

### 定数宣言
文字定数の宣言 `'A'`
整数定数の宣言 `100`

非常にシンプルです。

## サンプルプログラム

```c
#include <stdio.h>

int main(void)
{
	int count = 1024;
	char alphabet = 'M';
  printf("これは%dです！\n", count);
  printf("これは%cです！\n", alphabet);

  return 0;	
}

# => これは1024です！
# => これはMです！
```
標準出力に数字と文字を出力してみましょう。
C言語では、変数や定数を出力する際に型が合ってないと出力してくれません。

この`%`記号を**フォーマット指定子**と呼びます。
名前の通り、フォーマットを指定している識別子になります。
この型が合ってないと、コンパイルエラーになるので気をつけてください。
以下に対応表を示します。

|  フォーマット指定子 | データ型  |
|  :-------: | :-------: |
|   %d| 整数 |
|  %c |文字 |
|   %f|浮動小数点  |



```c
#include <stdio.h>

int main(void)
{
  int count = 1024;
  printf("これは%dです！\n", count);
  printf("これは%dです！\n", 114514);

  return 0;	
}
```

上記のように、変数からでもいいですし、そのまま整数定数を書いても指定子は対応してくれます。


## <i class="fa fa-star"></i> まとめ

C言語を使って標準出力にアウトプットする簡単なサンプルコードを書いてみました。

プログラミング言語の中ではC言語は型付けチェックは弱く、**静的な弱い型付け**の性質を持つ言語です。
文字と整数の足し算などをしてもエラーにすらならないことから、**型安全ではない**と言えるでしょう。

そして、コンパイル時に検出されなかったものはランタイムエラーの原因になりますので、C言語に限らず**静的か動的か？型付けは強いのか弱いか？**という点にも着目しながらコードを書くとより安全なコードになるのかもしれません。

Rubyのような動的かつ強い型付け言語で、強力な型推論の付いている(いわゆる型安全)言語をやっている自分にとってはカルチャーショックがあるのは否定できません。

ぬるぬる、C言語という偉大な遺産に触れていければいいなと思ってます。
それでは、また次回会いましょう。





## 参照
* 独習C P12まで
* http://www.cc.kyotosu.ac.jp/~yamada/programming/float.html#double
* http://webkaru.net/clang/mac-gcc-compile/
* http://capm-network.com/?tag=%E5%9E%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0