C言語マスターへの道:if文を使いこなして、ワンランク上のプログラマーを目指そう!


if文の基本構文

if文は、以下の3つの要素で構成されます。

  1. 条件式: 真偽値を評価する式。
  2. thenブロック: 条件式が真の場合に実行される処理。
  3. elseブロック: 条件式が偽の場合に実行される処理 (省略可能)。
if (条件式) {
  thenブロック;
} else {
  elseブロック;
}

:

int x = 10;

if (x > 5) {
  printf("xは5より大きい\n");
} else {
  printf("xは5以下\n");
}

この例では、x が 5 より大きいかどうかを条件式で判断し、then ブロックまたは else ブロックの処理を実行します。

条件式

条件式には、比較演算子、論理演算子、関係演算子などを組み合わせて、様々な条件を表現できます。

比較演算子:

  • >=: 大きいか等しい
  • >: 大きい
  • <=: 小さいか等しい
  • <: 小さい
  • !=: 等しくない
  • ==: 等しい

論理演算子:

  • !: 否定 (条件を反転)
  • ||: または (どちらかの条件が真の場合に真)
  • &&: そして (両方の条件が真の場合に真)

関係演算子:

  • isnt: 型の非同一性 (型が異なるかどうか)
  • is: 型の同一性 (型が同じかどうか)

:

int age = 20;
bool is_student = true;

if (age >= 18 && is_student) {
  printf("あなたは成人学生です\n");
} else {
  printf("あなたは成人学生ではありません\n");
}

この例では、age が 18 歳以上であり、かつ is_student が真であるかどうかを条件式で判断します。

else/else if文

else 文は、if 文の条件式が偽の場合に実行される処理を記述します。また、else if 文を複数使用することで、複数の条件分岐を表現できます。

if (条件式1) {
  処理1;
} else if (条件式2) {
  処理2;
} else {
  処理3;
}

:

int score = 85;

if (score >= 90) {
  printf("A\n");
} else if (score >= 80) {
  printf("B\n");
} else if (score >= 70) {
  printf("C\n");
} else {
  printf("D\n");
}

この例では、score の値に基づいて、5段階評価の文字を出力します。

ネスト構文

if文は、他のif文の中に嵌め込むことができます。これは、より複雑な条件分岐を表現する場合に有用です。

if (条件式1) {
  if (条件式2) {
    処理1;
  } else {
    処理2;
  }
} else {
  処理3;
}

:

int day = 1;

if (day == 1) {
  printf("月曜日\n");
  if (is_morning) {
    printf("おはようございます\n");
  } else {
    printf("こんにちは\n");
  }
} else if (day == 2) {
  printf("火曜日\n");
} else {
  // ...
}

この例では、曜日と時間帯に応じて、適切な挨拶を出力します。

閏年判定

以下のプログラムは、入力された年が閏年かどうかを判定します。

int year;
scanf("%d", &year);


int year;
scanf("%d", &year);

if (year % 4 == 0) {
  if (year % 100 != 0 || year % 400 == 0) {
    printf("%d年は閏年です\n", year);
  } else {
    printf("%d年は平年です\n", year);
  }
} else {
  printf("%d年は平年です\n", year);
}

以下のプログラムは、入力された年月日から曜日を出力します。

int year, month, day;
scanf("%d %d %d", &year, &month, &day);

int days_in_month = 0;
switch (month) {
  case 1:
  case 3:
  case 5:
  case 7:
  case 8:
  case 10:
  case 12:
    days_in_month = 31;
    break;
  case 4:
  case 6:
  case 9:
  case 11:
    days_in_month = 30;
    break;
  case 2:
    if (is_leap_year(year)) {
      days_in_month = 29;
    } else {
      days_in_month = 28;
    }
    break;
}

int total_days = 0;
for (int i = 1; i < month; i++) {
  total_days += days_in_month;
}

total_days += day;

int week_day = (total_days + 1) % 7;

printf("%d年%d月%d日は%s曜日です\n", year, month, day, get_week_day_name(week_day));

このプログラムは、閏年判定の関数 is_leap_year() と、曜日名を返す関数 get_week_day_name() を必要とします。これらの関数の詳細な実装は、省略させていただきます。

上記以外にも、様々な状況でif文を活用することができます。例えば、以下のような用途が考えられます。

  • 数学的な計算を行う
  • エラー処理を行う
  • ファイルの読み書きを制御する
  • ユーザー入力に基づいて処理を分岐する

if文は、C言語において非常に重要な構文です。このガイドで説明した内容を理解し、実際にプログラムの中で活用することで、より柔軟で効率的なコードを書くことができるようになります。

  • if文のネストを深くしすぎると、コードが読みづらくなり、保守性が低下する可能性があります。適切な場所でコメントを挿入したり、関数を分割したりすることで、コードの可読性を向上させるように心がけましょう。
  • C言語には、switch 文や case 文など、条件分岐を表現する他の構文も用意されています。それぞれの構文の特徴を理解し、状況に応じて適切なものを選択することが重要です。


  1. 三項演算子: シンプルな条件分岐を簡潔に記述できます。
  2. switch文: 複数の条件分岐を効率的に表現できます。
  3. goto文: 特定の場所にジャンプする処理を記述できます。(※注意: goto 文は悪用するとコードが複雑になり、保守性が低下する可能性があるため、慎重に使用すべきです。)

三項演算子

三項演算子は、条件式 ? を用いて、真偽値に応じて異なる値を返す演算子です。構文は以下の通りです。

condition ? value_if_true : value_if_false

:

int x = 10;
int y = (x > 5) ? 20 : 30;

この例では、x が 5 より大きい場合に y に 20 を、そうでない場合は 30 を代入します。

三項演算子の利点:

  • コードが読みやすくなる
  • シンプルな条件分岐を簡潔に記述できる

三項演算子の注意点:

  • 複数の処理を記述できない
  • 複雑な条件分岐には不向き

switch文

switch 文は、複数の条件分岐を効率的に表現できる構文です。構文は以下の通りです。

switch (expression) {
  case value1:
    statement1;
    break;
  case value2:
    statement2;
    break;
  // ...
  default:
    statement_default;
}

:

int day = 1;

switch (day) {
  case 1:
    printf("月曜日\n");
    break;
  case 2:
    printf("火曜日\n");
    break;
  // ...
  default:
    printf("その他\n");
}

この例では、day の値に応じて、曜日を出力します。

switch文の利点:

  • コードが読みやすくなる
  • 複数の条件分岐を効率的に記述できる

switch文の注意点:

  • default ラベルを必ず記述する必要がある
  • if文 より冗長な記述になる場合がある

goto文

goto 文は、特定の場所にジャンプする処理を記述できる構文です。構文は以下の通りです。

goto label;

:

int x = 10;

if (x > 5) {
  goto label1;
} else {
  goto label2;
}

label1:
  printf("xは5より大きい\n");
  goto exit;

label2:
  printf("xは5以下\n");

exit:

この例では、x が 5 より大きい場合に label1 にジャンプし、そうでない場合は label2 にジャンプします。その後、いずれの場合も exit ラベルにジャンプして処理を終了します。

goto文の利点:

  • 特定の処理を簡単に記述できる

goto文の注意点:

  • 悪用すると、プログラムのバグが発生しやすくなる
  • コードが複雑になり、保守性が低下する可能性がある

上記以外にも、関数やマクロなどを利用することで、if文 を代替する方法があります。状況に応じて適切な方法を選択することが重要です。

if文 の代替方法を選択する際には、以下の点を考慮する必要があります。

  • 保守性: コードを将来修正しやすいように、適切な構造を選択しましょう。
  • コードの可読性: コードが読みやすく、わかりやすい記述であることを心がけましょう。
  • 条件分岐の複雑さ: シンプルな条件分岐であれば、三項演算子が適しています。複雑な条件分岐であれば、switch文 または適切な関数を使用します。

これらの点を踏まえ、状況に応じて最適な方法を選択してください。