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文でもブロックを書くと、保守性が高くなる。