C言語とは
C言語は、OS、組み込み機器、ライブラリなど幅広い分野で使われるコンパイル型言語です。値がメモリ上でどのように扱われるかを意識して書くため、コンピュータの仕組みを学ぶ入口にもなります。
- ソースコードを機械が実行できる形へ変換する流れ
- 型とメモリサイズを意識したデータ処理
- 関数へ処理を分ける設計
- ポインタを使ったメモリとデータ構造の操作
コンパイルして実行しよう
GCCまたはClangを用意し、ターミナルで確認します。WindowsではWSLやVisual Studioの開発者コマンドプロンプトなど、環境に合う方法を選びます。
gcc --versionhello.cを作成します。拡張子は.cです。
#include <stdio.h>
int main(void) {
printf("こんにちは、C言語!\n");
return 0;
}gcc -std=c17 -Wall -Wextra -pedantic hello.c -o hello
./helloこんにちは、C言語!hello.exeなら、PowerShellでは.\hello.exeを実行します。プログラムの基本構造
#includeは必要な宣言を取り込み、main関数が実行の入口になります。文の末尾にはセミコロンを書き、波かっこで処理のまとまりを表します。
#include <stdio.h>
int main(void) {
// 1行コメント
printf("1番目\n");
printf("%d\n", 10 + 20); /* 複数行にも使えるコメント */
printf("3番目\n");
return 0;
}1番目
30
3番目変数とデータ型
C言語では、変数を使う前に型と名前を宣言します。型によって表せる値とサイズが異なります。
| 型 | 用途 | printfの指定 |
|---|---|---|
int | 整数 | %d |
double | 小数 | %f |
char | 1文字 | %c |
size_t | サイズ・要素数 | %zu |
#include <stdio.h>
int main(void) {
int age = 20;
double height = 170.5;
char grade = 'A';
printf("年齢: %d\n", age);
printf("身長: %.1f\n", height);
printf("評価: %c\n", grade);
printf("intのサイズ: %zuバイト\n", sizeof(int));
return 0;
}年齢: 20
身長: 170.5
評価: A
intのサイズ: 4バイトsizeof(int)の結果は処理系で異なる可能性があります。固定値と思い込まず、必要ならsizeofで確認します。安全に入力を受け取る
初学者向けの例でも、入力が常に正しいとは限りません。fgetsで一行を配列へ読み、sscanfの戻り値で変換できたか確認します。
#include <stdio.h>
int main(void) {
char line[100];
int age;
printf("年齢を入力してください: ");
if (fgets(line, sizeof line, stdin) == NULL) {
fprintf(stderr, "入力を読み取れませんでした\n");
return 1;
}
if (sscanf(line, "%d", &age) != 1 || age < 0) {
fprintf(stderr, "0以上の整数を入力してください\n");
return 1;
}
printf("来年は%d歳です\n", age + 1);
return 0;
}年齢を入力してください: 20
来年は21歳です&ageは変数ageのアドレスです。詳しくは発展編のポインタで学びます。
演算子と型変換
#include <stdio.h>
int main(void) {
int total = 7;
int count = 2;
printf("整数: %d\n", total / count);
printf("小数: %.1f\n", (double)total / count);
printf("余り: %d\n", total % count);
return 0;
}整数: 3
小数: 3.5
余り: 1整数同士の/は小数部分を切り捨てます。(double)によるキャストで一方を小数へ変換すると、小数の割り算になります。
条件分岐
#include <stdio.h>
int main(void) {
int score = 82;
if (score >= 80) {
printf("合格(よくできました)\n");
} else if (score >= 60) {
printf("合格\n");
} else {
printf("再挑戦\n");
}
return 0;
}合格(よくできました)==は比較、=は代入です。条件式で取り違えないよう、警告を有効にします。繰り返し
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 3; i++) {
printf("%d回目\n", i);
}
int count = 3;
while (count > 0) {
printf("%d ", count);
count--;
}
printf("スタート\n");
return 0;
}1回目
2回目
3回目
3 2 1 スタートwhileの条件に使う値を更新し忘れると終了しません。終了条件を先に決めましょう。配列
配列は同じ型の値を連続して並べます。添字は0から始まり、要素数はsizeof scores / sizeof scores[0]で求められます。
#include <stdio.h>
int main(void) {
int scores[] = {70, 85, 90};
size_t length = sizeof scores / sizeof scores[0];
int total = 0;
for (size_t i = 0; i < length; i++) {
total += scores[i];
}
printf("合計: %d\n", total);
printf("平均: %.1f\n", (double)total / length);
return 0;
}合計: 245
平均: 81.7scores[3]を読み書きしてはいけません。文字列
C言語の文字列は、末尾にヌル文字'\0'を持つchar配列です。strlenは終端を除く長さを返します。
#include <stdio.h>
#include <string.h>
int main(void) {
char name[] = "Mity";
printf("名前: %s\n", name);
printf("長さ: %zu\n", strlen(name));
printf("配列サイズ: %zu\n", sizeof name);
return 0;
}名前: Mity
長さ: 4
配列サイズ: 5配列サイズが5なのは、4文字に終端の1バイトを加えるためです。日本語の文字数とバイト数は一致しない場合があります。
関数
関数の宣言では、戻り値の型、名前、引数の型を書きます。呼び出しより前にプロトタイプ宣言を置くと、定義を下へ分けられます。
#include <stdio.h>
int calculate_total(int price, int count);
int main(void) {
int total = calculate_total(500, 3);
printf("合計は%d円です\n", total);
return 0;
}
int calculate_total(int price, int count) {
return price * count;
}合計は1500円です- 名前から役割が分かるようにする
- 一つの関数へ一つの役割を持たせる
- 入力・表示と計算を分ける
- 結果は戻り値で返し、グローバル変数を増やさない
変数のスコープと寿命
波かっこの中で宣言した変数は、その範囲の外から使えません。必要な場所に近い位置で宣言すると、誤って変更される範囲を小さくできます。
#include <stdio.h>
int main(void) {
int total = 100;
if (total > 0) {
int tax = 10;
printf("税込: %d\n", total + tax);
}
/* ここではtaxを使えない */
return 0;
}税込: 110練習問題:最高点を求める
整数配列{68, 92, 75, 88}から最高点を探す関数find_maxを作り、「最高点: 92」と表示してください。関数には配列と要素数を渡します。
次に学ぶこと
基礎を実行できたら、C言語の重要な仕組みをテーマ別に学びます。
