
C言語基礎|複合文(ブロック)
複合文(ブロック)とは
これまでのプログラムでは、if 文の中で
「1つの文」を実行する形が多かったですね。
でも実際のプログラムでは、
- 条件が成立したら、複数の処理をまとめて実行したい。
- 変数の代入や表示を、ひとかたまりとして扱いたい。
という場面がたくさん出てきます。
そんなときに使うのが
複合文(compound statement)、別名 ブロック(block) です。

複合文の基本構造
複合文は、次の形で書きます。
| 構造 | 意味 |
|---|---|
| { 文や宣言の並び } | 複数の処理を1つの文としてまとめる。 |
文章で図解すると、次のようなイメージです。
{
文または宣言
文または宣言
文または宣言
}
- 文は0個以上書ける
- 宣言も書ける
- 順序は自由
この全体が 1つの文 として扱われます。
サンプルプログラム
ここでは次の処理を行うプログラムを考えます。
二つの整数を読み込み、合計と差の両方を表示する
プロジェクト名:chap3-9-1 ソースファイル名:chap3-9-1.c
Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。
#include <stdio.h>
int main(void)
{
int a, b;
puts("二つの整数を入力してください。");
printf("A:"); scanf("%d", &a);
printf("B:"); scanf("%d", &b);
int sum, diff;
if (a >= b) {
sum = a + b;
diff = a - b;
} else {
sum = a + b;
diff = b - a;
}
printf("合計は%dです。\n", sum);
printf("差は%dです。\n", diff);
return 0;
}実行結果の例
二つの整数を入力してください。
A:7
B:3
合計は10です。
差は4です。if 文と複合文の関係
この if 文が制御しているのは、次の2つの部分です。
if (a >= b)
{ sum = a + b; diff = a - b; }
else
{ sum = a + b; diff = b - a; }それぞれ { から } までが 1つの複合文 です。
つまり if 文は、
- 条件が成立したら「1つの文」を実行
- そうでなければ「別の1つの文」を実行
というルールを守っています。
その「1つの文」として使われているのが、複合文なのです。
複合文は「単一の文」として扱われる
ここがとても重要なポイントです。
複合文は見た目は複数行ですが、
文法上は1つの文 として扱われます。
そのため、if や else の直後に置けます。
文章による構文図イメージは、次のとおりです。
if (条件)
文
else
文この「文」の部分に、
普通の文も、複合文も置ける、というわけです。
よくある間違い(ブロックを省略した例)
次のコードは、意図どおりに動きません。
if (a >= b)
sum = a + b;
diff = a - b;
else
sum = a + b;
diff = b - a;文章で説明すると、
- if が制御しているのは sum = a + b; だけ
- diff = a - b; は無条件に実行される
- else が対応する if が見つからず、エラーになる
という状態です。
複数の文をまとめたいときは、必ずブロックにする
これが鉄則です。
1文しかなくてもブロックを書く理由
次の2つの書き方は、動作としては同じです。
if (a >= b) {
sum = a + b;
} else {
sum = b + a;
}if (a >= b) {
sum = a + b;
} else {
sum = b + a;
}後者のほうが、
- 後から文を追加しやすい。
- 修正ミスが起きにくい。
- 見た目が分かりやすい。
というメリットがあります。
そのため、実務では
1文でもブロックを書く 書き方がよく使われます。
実は最初から使っていた複合文
これまで書いてきたすべてのプログラムには、
すでに複合文が登場していました。
int main(void)
{
// 処理
return 0;
}この { から } まで全体が、
main 関数の中の複合文 です。
つまり、最初の一歩から
ブロックはずっと使っていた、ということですね。
まとめ
- 複合文(ブロック)は { } で囲まれた文の集まり。
- 文法上は「1つの文」として扱われる。
- if や else で複数の処理をまとめるために必須
- 1文でもブロックを書くと、保守性が高くなる。
