【第4回】C言語の条件分岐:if文とswitch文の使い方
1. はじめに:条件に応じて処理を分岐させよう
前回は、複数のデータをまとめて管理する配列や文字列、そして各種演算子の使い方を確認しました。
プログラムを作っていくうえで、「特定の条件を満たしたときだけにこの処理を行いたい」「ユーザーからの入力値やステータスに応じて処理を変えたい」という動的な制御は非常に重要になります。
C言語の条件分岐や制御構文の基本的な書き方は、PHPなどの高水準な言語と共通している部分が多くありますが、ユーザー入力を受け取る scanf 関数など、C言語ならではのメモリを意識したルールも存在します。
今回は、if 文や switch 文による条件分岐、論理演算子や三項演算子、そしてキーボード入力を受け取る scanf の仕組みを確認していきましょう。
2. if 文の基本パターン
特定の条件を満たした場合にのみ特定の処理を実行するための仕組みが if 文です。基本的な構文や書き方はPHPとほぼ共通しています。
単体の if 文
int error_code = 0;
if (error_code == 0) {
printf("エラーは検出されませんでした。\n");
}
二者択一 (if ~ else 文) と多岐分岐 (if ~ else if 文)
状況に応じて処理を分ける基本的なパターンです。
// 二者択一の例
if (is_connected) {
printf("サーバーに接続しています\n");
} else {
printf("切断されました\n");
}
// 多岐分岐の例
if (http_status == 200) {
printf("リクエストは正常に処理されました (OK)\n");
} else if (http_status == 404) {
printf("指定されたリソースが見つかりません (Not Found)\n");
} else {
printf("予期せぬステータスコードです\n");
}
3. 三項演算子
条件式の結果(真・偽)によって異なる値をコンパクトに代入・評価したい場合に、三項演算子を使用できます。
// 試行回数が上限を超えたら0にリセットし、そうでなければ1増やす
retry_count = (retry_count >= max_limit) ? 0 : ++retry_count;
- 書き方:
(条件式) ? (式1: 真の場合) : (式2: 偽の場合)
4. 論理演算子
複数の条件を組み合わせて判定したい場合には、以下の論理演算子を使用します。
&&: 「かつ」(AND)—— すべての条件を満たした場合に真||: 「または」(OR)—— いずれかの条件を満たした場合に真!: 「〜ではない」(NOT)—— 条件の真偽を反転させる
5. if 文の入れ子(ネスト)
条件分岐の中にさらに別の if 文を内包させることで、より複雑な条件判定を行うことができます。
if (is_maintenance_mode) {
if (user_role == 99) {
printf("メンテナンス中ですが管理者権限でアクセスを許可します\n");
} else {
printf("現在メンテナンス中です。しばらくお待ちください\n");
}
} else if (is_banned_ip) {
printf("アクセスが拒否されました (IP Block)\n");
} else {
printf("通常アクセスのためルーティングを実行します\n");
}
6. キーボード入力を受け取る scanf 関数
実行中のコンソール画面から、キーボードを介してユーザーからの文字・数値入力を受け取る標準ライブラリ関数が scanf です。
基本的な使い方と注意点
- 書式指定子:
printfと同様に、整数は%d、文字列は%sを使用します。 - アドレス演算子
&の必要性:- 数値変数の場合: 変数に直接値を書き込むため、変数のメモリ上の住所(アドレス)を指し示すアドレス演算子
&を付ける必要があります(例:scanf("%d", &port_number);)。 - 文字列配列の場合: 配列名自体が先頭アドレスを指しているため、
&は不要です(例:scanf("%s", user_input);)。
- 数値変数の場合: 変数に直接値を書き込むため、変数のメモリ上の住所(アドレス)を指し示すアドレス演算子
- PHPの「参照渡し(
&)」との違い:- PHPの
&(参照渡し)とは異なり、C言語の&は純粋な「メモリ上の物理アドレス(住所)を取得する演算子」です。
- PHPの
- 注意点:
- 入力エラーや想定外の値に対する厳密な制御機能が標準ではないため、学習や簡易プログラムでは「ユーザーが必ず正しい値を入力する」前提で使用するようにしましょう。
7. switch 文
特定の変数の「値」に応じて、分岐先を多岐に切り替えたい場合には switch 文を使用します。
int log_level = 2;
switch (log_level) {
case 1:
printf("[DEBUG] 詳細なログを出力します\n");
break;
case 2:
printf("[INFO] 通常の操作ログを出力します\n");
break;
case 3:
printf("[ERROR] エラーログを出力します\n");
break;
default:
printf("[UNKNOWN] 不明なログレベルです\n");
break;
}
各 case の最後には、後続の処理へのフォールスルー(意図しない連続実行)を防ぐため、break; を忘れないように記述することが重要です。
8. まとめと次回予告
今回は、プログラムの流れを柔軟に制御するための条件分岐(if 文・switch 文)、三項演算子、論理演算子、そしてユーザー入力を受け取る scanf 関数の使い方を確認しました。
今回学んだ内容を整理すると、次のとおりです。
if文やswitch文を使うことで、条件に応じた処理の分岐ができる- 論理演算子(
&&,||,!)や三項演算子を組み合わせることで複雑な判定をコンパクトに書ける scanfで数値を読み込む際は、アドレス演算子&を用いて変数のメモリ上の住所を指定する必要があるswitch文では、フォールスルーを防ぐために各caseの最後にbreak;を記述する
今回の内容を通して、ユーザーの入力や変数の状態に応じた動的なプログラムの組み立て方が見えてきたかと思います。
次回は、同じ処理を何度も効率よく実行するための「繰り返し処理(while文・for文)」について学びます。実際のコードを動かしながら、ループ処理の仕組みを確認していきましょう。
【お役立ちツールのご案内】
C言語やPHPの学習を進める中で、ご自身の書いたコードや既存のプロジェクトにセキュリティ上のリスクや古い書き方(非推奨関数など)が混ざっていないか気になった際は、安全な字句解析(
token_get_all())で一括スキャンできる当サイトの PHPレガシーコードスキャナー もぜひご活用ください。