C言語基礎|if文の形式と構文

if文は「形」がとても大事

if 文は、条件によって処理を分けるための重要な文ですが、
決められた形(構文)を厳密に守る必要があります。

C言語では、

  • 見た目がそれっぽくても
  • 人間には意味が通じていても

構文に合っていなければコンパイルエラーになります。

そこで今回は、
if 文の形式と構文を「形」からしっかり理解する
ことを目的に進めていきましょう。

if文の構文とは何か

プログラミング言語では、
文の正しい書き方を表したものを 構文 と呼びます。

if 文の構文図は、次の形で表されます。

if 文の構文

if → ( 式 ) → 文 → [ else → 文 ]

この構文は、
if 文として許される書き方のすべて
を表しています。

構文の読み方の基本

構文図は、次のルールで読みます。

ルール意味
左から右へ進む文の流れ
矢印に従う書ける順番
分岐はどちらでもよい書き方の選択肢
[] で囲まれた部分あってもなくてもよい

このルールを if 文に当てはめてみましょう。

if文の2つの正式な形式

構文図から分かる if 文の形式は、次の2つだけです。

形式説明
if (式) 文条件が真のときだけ実行
if (式) 文 else 文条件に応じて処理を分ける

これ以外の形は、すべてエラーになります。

書けないif文の例(構文エラー)

構文図に合わない if 文は、
コンパイル時に必ずエラーになります。

例①:条件式を()で囲んでいない

if score > 60
    puts("合格です。");

エラーの理由

  • 式は必ず ( ) で囲む必要がある

例②:if の後に文がない

if (x % 3)
else
    puts("3で割り切れます。");

エラーの理由

  • if の直後には必ず 文 が必要

「文」とは何かを正しく理解しよう

構文に出てくる「文」は、とても重要です。

C言語でいう とは、次のいずれかです。

種類
式文x = 3;
関数呼び出しputs("OK");
複文{ 文 文 … }
制御文if 文、while 文など

if 文の後ろに書けるのは、
文は1つだけ という点がポイントです。

サンプル①:文が1つのif文

まずは、文が1つだけの if 文です。

プロジェクト名:chap3-3-1 ソースファイル名:chap3-3-1.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 温度が高いかどうかを判定する
#include <stdio.h>

int main(void)
{
    int temp;

    printf("温度を入力してください:");
    scanf("%d", &temp);

    if (temp >= 30)
        puts("今日は暑いですね。");

    return 0;
}

ここでは、

  • if (式)
  • puts(...) ← 文(1つ)

という構造になっています。

複数の処理を行いたいときの注意点

次のように書くと、意図と違う動きになります。

if (score >= 60)
    puts("合格です。");
    puts("よく頑張りました。");

この場合、

  • if に含まれるのは最初の puts だけ
  • 次の puts は常に実行される

という構造になります。

複文を使った正しい書き方

複数の処理をまとめたい場合は、
複文(ブロック) を使います。

if (score >= 60) {
    puts("合格です。");
    puts("よく頑張りました。");
}

構文上では、

  • 文 → 複文

として扱われます。

サンプル②:elseを含む構文の確認

次は else を含んだ例です。

プロジェクト名:chap3-3-2 ソースファイル名:chap3-3-2.c

Visual Studio でこのプログラムを実行するには、SDLチェック設定を変更しておく必要があります。
1.プロジェクト名を右クリックして、「プロパティ」をクリックします。
2.「C/C++」→「全般」→「SDLチェック」を「いいえ」に切り替えて「OK」をクリックします。

// 数値が正か負かを判定する
#include <stdio.h>

int main(void)
{
    int num;

    printf("整数を入力してください:");
    scanf("%d", &num);

    if (num >= 0)
        puts("正またはゼロです。");
    else
        puts("負の数です。");

    return 0;
}

この形は、構文の

if → ( 式 ) → 文 → [ else → 文 ]

をそのまま辿った形になっています。

構文が教えてくれる大切なこと

構文図から読み取れる重要ポイントを整理しましょう。

ポイント内容
if の後は必ず (式)省略不可
( ) の後は必ず 文空は不可
else は省略可能あってもなくてもよい
else がある場合文が必須
文は1つだけ複数なら { } を使う

構文を理解するとバグが減る

if 文で起きやすいバグの多くは、

  • 文の範囲を勘違いしている。
  • 構文を意識していない。

ことが原因です。

構文を頭の中でなぞりながら書く
これだけで、ミスはぐっと減ります 👍

ここまで理解できれば、
if文を「感覚」ではなく「構文」で書ける ようになります ✨
次は、else if による多分岐が自然につながってきますよ。