
プログラミングの世界では、様々な状況に応じて異なる処理を行う必要がある。 例えば、ゲームで「ライフが0になったらゲームオーバー」や「入力された数字が10より大きければ特定のメッセージを表示する」といった判断が求められる。
このような判断を可能にするのが条件分岐である。
条件分岐
条件分岐とは、プログラムの実行過程で特定の条件が満たされたかどうかによって、処理の流れを変える仕組みだ。
C言語では主に「if文」を用いて条件分岐を実現する。
if文の基本的な書き方は以下の通りである。
if (条件式)
{
// 条件が真のときに実行される処理
}
この構文では、括弧内の条件式が「真」と判断されると、波括弧{}で囲まれた部分のコードが実行される。条件式が「偽」と判断された場合、この部分はスキップされて処理が続行される仕組みである。
C言語において「真」は数値の「1」、「偽」は数値の「0」で表される。
条件式の評価結果は常にこの2つのいずれかになる。
例えば、次のようなコードを見てみよう。
int score = 85;
if (score >= 80)
{
printf("合格です!\n");
}
#include <stdio.h>
int main() {
int score = 85;
if (score >= 80) {
printf("合格です!\n");
}
return 0;
}
合格です!
この例では、変数「score」の値が80以上かどうかを判断している。
scoreの値が85なので条件は「真」となり、「合格です!」というメッセージが表示されるわけだ。
もし条件が満たされない場合、つまり「偽」のときには何も実行されない。
たとえば、scoreが75だったら、条件式は「偽」と評価され、メッセージは表示されずに処理が進む。
条件式には関係演算子が使われる。
主な関係演算子には「==」(等しい)、「!=」(等しくない)、「>」(より大きい)、「<」(より小さい)、「>=」(以上)、「<=」(以下)などがある。
初心者がよく間違えるのは「=」と「==」の違いである。
「=」は代入を行う演算子であり、「==」は等しいかどうかを比較するための演算子だ。
以下は誤った例である。
if (x = 10) // 間違い!これは比較ではなく代入になる
正しくは次のように書かなければならない。
if (x == 10) // 正しい比較の書き方
if文は単独で使うだけでなく、後で学ぶ「else」や「else if」と組み合わせることで、より複雑な条件分岐を表現でき、プログラムは様々な状況に対応可能となるのだ。
条件分岐はプログラミングの基本中の基本であり、実用的なプログラムを作成するには不可欠な知識である。条件設定と処理の組み合わせで、入力や状況に応じて柔軟に動作するプログラムを作成できる。
関係演算子を使いこなす – 条件式の書き方
関係演算子は、C言語の条件分岐で使用される比較のための演算子である。
値同士の関係を判定し、その結果として真(1)または偽(0)の値を返す。
C言語では主に6種類の関係演算子を使って条件式を作成する。
等価演算子(==)は、左右の値が等しいかどうかを判定する。
例えば age == 20 という条件式は、変数ageの値が20と等しいときに真となる。
初心者が最も間違いやすいのがこの等価演算子だ。
単一の「=」は代入を意味し、二重の「==」が比較を意味することを必ず覚えておく。
if (score = 100) // 誤り:これは比較ではなく、scoreに100を代入している
if (score == 100) // 正しい:scoreが100と等しいかを比較している
不等演算子(!=)は、左右の値が等しくないときに真になる。
たとえば answer != 42 は、変数answerの値が42ではないときに真となる。
大小比較演算子には「大なり(>)」「小なり(<)」「以上(>=)」「以下(<=)」の4種類がある。
これらはそれぞれ、名前の通りの比較を行う。
if (temperature > 30) // 温度が30より大きいとき
if (age < 18) // 年齢が18未満のとき
if (score >= 60) // 点数が60以上のとき
if (battery <= 20) // バッテリーが20%以下のとき
C言語では、関係演算子の評価結果は常に整数値の1(真)または0(偽)になる。
この仕組みを理解していれば、次のようなコードの意味も自然と把握できるようになる。
int Adult = (age >= 18); // ageが18以上なら1、そうでなければ0が代入される
#include <stdio.h>
int main() {
int age = 20;
int Adult = (age >= 18); // ageが18以上なら1、それ以外は0
printf("Adult: %d\n", Adult);
return 0;
}
Adult: 1
age を17以下にすると
Adult: 0
関係演算子を使う際の重要なポイントは、比較する値のデータ型に注意することである。
異なるデータ型を比較すると、予期せぬ結果を招くことがある。
たとえば、整数と浮動小数点数(float型)を比較する場合、C言語は自動的に型変換を行う。
しかし、浮動小数点数の精度の問題によって、意図しないバグが発生することがある。
float x = 1.0;
if (x == 1) { // 整数の1と浮動小数点の1.0を比較
// 通常は真となるが、浮動小数点の精度問題で偽になる可能性もある
}
また、文字の比較においては、実際にはその文字のASCIIコード値(数値)が比較される仕組みである。
if ('A' < 'B') { // 真になる(ASCIIコードでは'A'は65、'B'は66)
printf("AはBより小さい\n");
}
関係演算子を理解し、適切に使いこなすことで、プログラムの動作を正確に制御できる条件式が書けるようになる。
特に「=」と「==」の違いは極めて重要だ。
条件式を記述する際には、常にこの違いに注意を払う必要がある。関係演算子を正しく使用することは、バグのない堅牢なプログラムを書くための基本スキルである。
if-else文による条件分岐の拡張
if文だけでは「条件が真のときだけ何かを実行する」という限定的な処理しか行えない。
しかし、実際のプログラムでは「条件が真のときはこれをして、偽のときは別のことをする」といった分岐が頻繁に求められる。
このような場面で活躍するのがelse文である。
else文はif文と組み合わせて使用し、if文の条件が偽であった場合に実行される処理を記述する。
基本的な構文は次のとおりである。
if (条件式) {
// 条件が真のときに実行される処理
} else {
// 条件が偽のときに実行される処理
}
たとえば、次のコードは点数によって合否を判定し、対応するメッセージを表示する。
#include <stdio.h>
int main() {
int score = 55; // 得点をここで設定します(例:55)
if (score >= 60) {
printf("合格です!\n");
} else {
printf("不合格です。もう少し頑張りましょう。\n");
}
return 0;
}
不合格です。もう少し頑張りましょう。
score = 75; などと変更してみると
合格です!
この例では、scoreが60未満のため条件は偽となり、elseブロックのメッセージ「不合格です。もう少し頑張りましょう。」が表示される。
if-else文を書く際に特に注意すべき点は、波括弧({ })の使い方である。
複数の文を実行する場合は、必ず波括弧で囲む必要がある。
1行だけの処理であれば波括弧は省略できるが、初心者のうちは常に波括弧を使用することが推奨される。
// 波括弧なし(推奨しない)
if (age >= 18)
printf("成人です。\n");
else
printf("未成年です。\n");
// 波括弧あり(推奨)
if (age >= 18) {
printf("成人です。\n");
} else {
printf("未成年です。\n");
}
もう一つ注意すべき重要な点は、セミコロン(;)の位置である。
if文やelse文の直後にセミコロンを誤って置いてしまうと、意図しない動作を引き起こす。
// 誤った書き方
if (temperature > 30); { // このセミコロンが問題
printf("暑いです!\n");
}
このコードでは、if文の条件式の直後にセミコロンがあるため、条件判定とは無関係に常に波括弧内の処理が実行されてしまう。
セミコロンはif文の直後には置かず、各文の終わりに正しく配置する必要がある。
セミコロン ; は、「その文が終わった」ことを示す記号だ。if (x > 0) は「条件をチェックして、次の文を実行するかどうかを決める」構造である。
if 文は条件であり、その後にセミコロンを付けると、条件が評価されても実行する内容が何もない空文が実行されてしまう。
もし外が暑ければ、芝生に水をやりなさい。
「外が暑ければ」という条件だけでは意味をなさない。
条件分岐の基本構文を紹介したが、波括弧とセミコロンの扱いには注意して、確実に使いこなせるようにしていこう。
実践的なif文活用例とコーディング技法
if文を実用的に活用するため、具体的なプログラム例を示す。
まずは数値比較の基本的な例として、学生の点数に応じて成績を判定するプログラムを示す。
#include <stdio.h>
int main() {
int score = 78;
if (score >= 90) {
printf("成績:A\n");
} else if (score >= 80) {
printf("成績:B\n");
} else if (score >= 70) {
printf("成績:C\n");
} else if (score >= 60) {
printf("成績:D\n");
} else {
printf("成績:F\n");
}
return 0;
}
成績:C
このプログラムでは、「else if」を用いて複数の条件分岐を記述している。
条件は上から順に評価され、最初に真となる条件が見つかると、その処理が実行され、それ以降の条件分岐は無視される。
文字列比較
C言語において文字列比較を行う際は、関数strcmp()を使用する必要がある。
「==」演算子はポインタの比較を行うものであり、文字列の中身の比較には使用できない。
strcmp()関数は、2つの文字列が一致している場合に0を返す。
#include <stdio.h>
#include <string.h>
int main() {
char password[20] = "secret123";
if (strcmp(password, "secret123") == 0) {
printf("パスワードが一致しました\n");
} else {
printf("パスワードが違います\n");
}
return 0;
}
パスワードが一致しました
だけでなくを追加する必要がある。
strcmp(password, “secret123”) == 0 は、password 変数の内容と “secret123” を比較し、一致すれば0を返す。
より複雑な条件を表現したい場合には、論理演算子を用いて複数の条件式を組み合わせる。
主に使用される論理演算子には「&&」(論理AND)、「||」(論理OR)、「!」(論理NOT)がある。
#include <stdio.h>
int main() {
int age = 25;
int income = 300000;
// 年齢が20歳以上かつ収入が20万円以上の場合
if (age >= 20 && income >= 200000) {
printf("ローン申請が可能です\n");
}
// 会員か、または初回購入の場合に割引を適用
int isMember = 1; // 1は真、0は偽
int isFirstPurchase = 0;
if (isMember || isFirstPurchase) {
printf("10%%割引が適用されます\n");
}
// 在庫がない場合の判定
int stockAvailable = 0;
if (!stockAvailable) {
printf("在庫切れです\n");
}
return 0;
}
ローン申請が可能です
10%割引が適用されます
在庫切れです
コードを書く際には、可読性を高めるためのフォーマットも重要である。
以下に示すポイントを意識することで、読みやすく保守性の高いコードが実現できる。
- 一貫したインデントを使用する。
通常は半角スペース4つ、またはタブ1つを使用する。 - 波括弧のスタイルを統一する。
一般的には以下の2種類のスタイルがある。
// K&Rスタイル(C言語で最も一般的なスタイル)
if (condition) {
// 処理
}
// Allmanスタイル(波括弧を次の行に置く)
if (condition)
{
// 処理
}
- 長い条件式は複数行に分けることで、読みやすさが向上する。
if ((age >= 18 && income >= 250000) ||
(hasGuarantor && creditScore > 700)) {
// 処理
}
- 複雑な条件式は変数に格納して名前をつけることで、コードの意図が明確になる。
int isAdult = age >= 18;
int hasEnoughIncome = income >= 250000;
int isEligible = isAdult && hasEnoughIncome;
if (isEligible) {
// 処理
}
これらの技法を適切に活用することで、条件分岐を用いた可読性が高く堅牢なプログラムを記述することが可能である。
プログラムの品質を高めるためには、構文だけでなく記述スタイルにも常に注意を払う必要がある。
条件分岐を使った実用的なC言語プログラミング
実際のプログラム開発においては、if文を多様な形で活用し、問題解決に導くことが重要である。たとえば、簡易的な電卓プログラムでは、ユーザーが選択した演算子に応じて異なる計算処理を行う必要がある。
#include <stdio.h>
int main() {
float num1 = 10.5;
float num2 = 5.2;
char operator = '+';
float result;
if (operator == '+') {
result = num1 + num2;
} else if (operator == '-') {
result = num1 - num2;
} else if (operator == '*') {
result = num1 * num2;
} else if (operator == '/') {
if (num2 != 0) { // ゼロ除算のチェック
result = num1 / num2;
} else {
printf("エラー:ゼロで割ることはできません\n");
return 1; // エラーコードを返して終了
}
} else {
printf("無効な演算子です\n");
return 1;
}
printf("計算結果: %.2f\n", result);
return 0;
}
このような条件分岐を含むプログラムをデバッグする際には、すべての条件パスが正しく機能しているかを確認する必要がある。そのための有効な手法の一つが、境界値テストである。たとえば成績を判定するプログラムであれば、成績の切れ目となる点数(例:89点、90点など)でテストすることで、処理が適切に分岐されているかを確認できる。
// テスト用の値
int testScores[] = {59, 60, 69, 70, 79, 80, 89, 90, 100};
また、if文の使用においては以下のようなよくある誤りにも注意が必要である。
1. 条件式の評価ミス
代入(=)と等価比較(==)の混同は、非常にありがちなミスである。この誤りを防ぐ一つの方法として、定数を左側に記述するスタイルがある。=と書いた場合には構文エラーとなるため、誤りを早期に検出可能である。
// より安全な書き方(定数を左側に置く)
if (10 == x)
2. 不要な条件チェック
既に確認済みの条件を再度評価するのは非効率であり、冗長である。以下にその一例を示す。
// 非効率的な書き方
if (score >= 90) {
grade = 'A';
} else if (score >= 80 && score < 90) { // score < 90 は不要
grade = 'B';
}
3. 複雑な条件式の関数化
複雑な条件式を関数として切り出すことで、コードの見通しを良くし、再利用性も向上させることができる。
int isValidInput(int age, float income) {
return age >= 20 && income > 0;
}
if (isValidInput(userAge, userIncome)) {
// 処理
}
4. 短絡評価の理解と活用
C言語では、&&(論理AND)および||(論理OR)は短絡評価と呼ばれる特性を持っている。
すなわち、&&においては左辺が偽(false)であれば右辺は評価されず、||では左辺が真(true)であれば右辺は評価されない。
この性質を活かすことで、より効率的かつ安全なコードを書くことが可能である。
// divisorが0の場合、右辺は評価されず安全
if (divisor != 0 && (number / divisor) > 10) {
// 処理
}
まとめ
以上のテクニックを意識的に活用することで、条件分岐を中心とした堅牢かつ効率的なC言語プログラムを作成することが可能となる。複雑な分岐ロジックを扱う際には、構文だけでなく可読性や保守性といった側面にも十分配慮していこう。