基本構文
C言語の基本構文を学ぶのは、漢字の筆画を学ぶようなものです——横、縦、左払い、右払いはシンプルに見えますが、美しい文字はすべてそこから構成されています。
プログラムの構造
すべての C言語プログラムは決まった骨格を共有しています。プログラムがどんなに複雑になっても、コア構造は同じです:
#include <stdio.h>
int main(void) {
return 0;
}
これは最小の有効な C言語プログラムです——何もしませんが、構造は完璧です。分解してみましょう:
プリプロセッサディレクティブ
#include <stdio.h> はプリプロセッサディレクティブです。# で始まり、コンパイルの前に処理されます。
#include— 指定したヘッダファイルの内容をこの位置に挿入<stdio.h>— 標準入出力ヘッダファイル。printfやscanfなどの関数の宣言を含む- 山括弧
<>はプリプロセッサにシステムディレクトリでヘッダを検索するよう指示
他にもよく使うヘッダファイルがあります:
| ヘッダ | 提供する機能 |
|---|---|
<stdio.h> |
入出力(printf、scanf) |
<stdlib.h> |
一般ユーティリティ(malloc、exit) |
<math.h> |
数学関数(sqrt、sin) |
<string.h> |
文字列操作(strlen、strcpy) |
<ctype.h> |
文字分類(isdigit、toupper) |
main関数
int main(void) {
return 0;
}
int— 関数が整数を返すmain— 関数名。C言語ではプログラムの実行は main 関数から始まると規定(void)— 空の引数リスト。関数が引数を取らないことを示す{ }— 波括弧で囲まれた関数本体return 0— 0 を返してプログラムの正常終了を示す
main は C言語プログラムの唯一の開始点です。main 関数は 1 つしか持てません——オペレーティングシステムがこれを呼び出してプログラムを開始します。
mainの別の形式
教科書によっては異なる形式の main を見かけることがあります:
int main(int argc, char *argv[])
この形式はコマンドライン引数を受け取ることができます。詳細は後で解説します。今は int main(void) で十分です。
void main() が使われていることがありますが、これは標準 C言語ではなく、一部のコンパイラは警告を出します。常に int main(void) を使ってください。
文とセミコロン
C言語では、セミコロン ; が文の終わりを示します。文章の末尾に句点(。)が必要なように、文にはセミコロンが必要です。
int age = 18;
age = age + 1;
printf("私は %d 歳です\n", age);
それぞれの行が 1 つの文で、セミコロンで終わっています。
よくある間違い——セミコロンの忘れ:
int age = 18
コンパイラは「改行」を認識しません——認識するのはセミコロンだけです。理論上はすべてのコードを 1 行に書くこともできます:
int age = 18; age = age + 1; printf("%d\n", age);
構文上は有効ですが、推奨されません。良いコーディングスタイルは 1 行に 1 文です。
;
特定の場合(空のループ本体など)で役立ちますが、今は気にする必要はありません。
コードブロック
波括弧 {} で囲まれた一連の文がコードブロック(複合文とも呼ばれる)を形成します:
int main(void) {
int x = 10;
int y = 20;
int sum = x + y;
printf("合計 = %d\n", sum);
return 0;
}
main 関数の本体全体が 1 つのコードブロックです。コードブロックはスコープを定義します——ブロック内で宣言された変数はブロック外からアクセスできません。
コードブロックはネスト(入れ子)にできます:
int main(void) {
int a = 1;
{
int b = 2;
printf("a + b = %d\n", a + b);
}
return 0;
}
内側のブロックは外側の a にアクセスできますが、外側のブロックは内側の b にアクセスできません。
printf関数
printf は C言語で最もよく使われる出力関数です。名前は print formatted(フォーマット出力)に由来します。
基本的な使い方
printf("Hello, World!\n");
二重引用符の中の内容はフォーマット文字列と呼ばれ、エスケープ文字を除いてそのまま出力されます。
フォーマット指定子
printf の強みは、変数の値をフォーマットして出力できることです:
int age = 18;
float height = 1.75f;
char grade = 'A';
printf("年齢: %d\n", age);
printf("身長: %.2f\n", height);
printf("成績: %c\n", grade);
よく使うフォーマット指定子:
| 指定子 | 型 | 出力例 |
|---|---|---|
%d |
int | 42 |
%f |
float / double | 3.140000 |
%.2f |
float(小数点以下 2 桁) | 3.14 |
%c |
char | A |
%s |
文字列 | hello |
%ld |
long | 100000 |
%x |
16 進整数 | 2a |
%o |
8 進整数 | 52 |
%% |
パーセント記号そのもの | % |
printf で複数の指定子を使えます——引数の順序に対応します:
int a = 3, b = 4;
printf("%d + %d = %d\n", a, b, a + b);
幅と配置
printf("[%5d]\n", 42);
printf("[%-5d]\n", 42);
printf("[%05d]\n", 42);
[ 42]
[42 ]
[00042]
%5d— 最小幅 5、右揃え%-5d— 最小幅 5、左揃え%05d— 最小幅 5、ゼロ埋め
エスケープ文字
文字列の中で直接入力できない文字(改行やタブなど)は、バックスラッシュ \ で始まるエスケープ文字で表します:
| エスケープ | 意味 | 例 |
|---|---|---|
\n |
改行 | printf("A\nB") は A と B を別の行に出力 |
\t |
水平タブ | 整列出力によく使用 |
\\ |
バックスラッシュそのもの | \ を出力するには \\ と書く |
\" |
二重引用符 | 文字列中に " を出力 |
\' |
単一引用符 | 文字リテラル中に ' を出力 |
\0 |
ヌル文字 | 文字列の終端を示す |
\r |
復帰 | カーソルを行頭に移動 |
\b |
バックスペース | カーソルを 1 つ左に移動 |
printf("C:\\Users\\admin\\file.txt\n");
C:\Users\admin\file.txt
コメント
コメントは人間のためのメモです——コンパイラは完全に無視します。良いコメントはコードを理解しやすくします。
1 行コメント
C99 では // 形式の 1 行コメントが導入されました。// から行末までがコメントです:
int score = 100;
複数行コメント
/* */ 形式のコメントは複数行にまたがれます:
/*
* このプログラムは
* 2 つの数の合計を計算する
*/
#include <stdio.h>
int main(void) {
int a = 10;
int b = 20;
printf("%d\n", a + b);
return 0;
}
コメントのベストプラクティス
コメントはなぜ(理由)を説明すべきで、何を(当たり前のこと)は説明不要です。コード自体が何をしているかはすでに語っています——コメントは、コードでは表現できない設計意図や判断を補足するものです。
良いコメント:
int max_retries = 3;
不要なコメント(コードですべてを説明済み):
int x = 10;
/*
/* ネストされたコメント */
*/
内側の */ が外側のコメントを途中で閉じてしまい、残りの */ が構文エラーになります。
識別子とキーワード
識別子の名前規則
識別子は自分で作る名前(変数名、関数名など)です。次の規則に従う必要があります:
- 英字(a-z、A-Z)、数字(0-9)、アンダースコア(_)のみ使用可能
- 英字またはアンダースコアで始める必要がある——数字で始められない
- 大文字と小文字は区別される(
ageとAgeは別の識別子) - C言語のキーワードは使用不可
有効な名前:age、student_name、_count、MAX_SIZE
無効な名前:2name(数字で始まる)、my-age(ハイフンを含む)、int(キーワード)
命名規約
| スタイル | 形式 | 用途 | 例 |
|---|---|---|---|
| snake_case | 小文字 + アンダースコア | 変数名、関数名 | student_count |
| UPPER_CASE | すべて大文字 + アンダースコア | 定数 | MAX_BUFFER_SIZE |
| CamelCase | 各単語の先頭を大文字 | カスタム型名 | StudentInfo |
C言語は伝統的に snake_case を使い、Java/C# のように camelCase は好まれません。最も重要なのは、プロジェクト内で一貫性を保つことです。
C99のキーワード
C99 には 37 のキーワードがあり、すべて小文字です:
| 分類 | キーワード |
|---|---|
| データ型 | char short int long float double void signed unsigned _Bool _Complex _Imaginary |
| 制御フロー | if else switch case default for while do break continue goto return |
| 記憶域クラス | auto extern static register typedef inline |
| 構造体 | struct union enum |
| その他 | const volatile sizeof restrict |
これらを暗記する必要はありません——練習を重ねれば自然に覚えます。重要なのはキーワードは識別子として使えないということだけ知っておけば大丈夫です。
例
この章の内容をすべて組み合わせたプログラムで、基本構文を実演します:
#include <stdio.h>
int main(void) {
printf("=== 学生情報 ===\n");
printf("名前:\t%s\n", "Alice");
printf("年齢:\t%d\n", 20);
printf("得点:\t%.1f\n", 95.5);
printf("成績:\t%c\n", 'A');
printf("================\n");
return 0;
}
=== 学生情報 ===
名前: Alice
年齢: 20
得点: 95.5
成績: A
================
このプログラムは次の要素を実演しています:#include プリプロセッサディレクティブ、main 関数の構造、printf フォーマット出力、\n 改行、\t タブ整列、そして 4 つの一般的なフォーマット指定子(%d、%.1f、%c、%s)です。
❓ よくある質問
📖 まとめ
- C言語プログラムの骨格:
#includeヘッダ +int main(void)関数 +return 0 - セミコロンが文の終わりを示します。すべての文は必ずセミコロンで終わる必要があります
- 波括弧
{}はコードブロックを形成し、変数のスコープを定義します - printf はフォーマット指定子で異なるデータ型を出力します:
%d、%f、%c、%s - エスケープ文字は
\で始まります:\nは改行、\tはタブ、\\はバックスラッシュそのもの
📝 練習問題
- printf を使って自分の情報カード(名前、年齢、趣味)を表示するプログラムを書いてください。\t で整列させること
- printf の呼び出し 1 回で次の内容を出力するプログラムを書いてください(エスケープ文字で改行とタブを使用):名前 Alice、年齢 25、都市 London
- 意図的にコードにネストされた複数行コメントを書き、コンパイラのエラーメッセージを観察してください



