C言語で条件分岐や繰り返し処理を書いていくためには、比較演算子と論理演算子の理解が欠かせません。
これらは「条件式」を作るための基本部品であり、if文やfor文・while文など、あらゆる場面で登場します。
この記事では、初心者の方でも迷わないように、図解や具体的なコード例を交えながら、比較演算子と論理演算子の仕組みと使い方を詳しく解説していきます。
C言語の比較演算子とは?
比較演算子の基本
比較演算子とは、2つの値を比べて「等しいか」「大きいか」「小さいか」などを判断し、その結果を真(1)か偽(0)として返す演算子です。
if文やwhile文の条件式の中でよく使われ、プログラムの流れを決める重要な役割を持っています。

比較演算子は、どれも「左の値」と「右の値」を比べて結果を返すという共通の働きをします。
結果そのものは整数値ですが、条件式の中では「真か偽か」として扱われます。
比較演算子の基本的なポイントとして、以下のような性質があります。
- 比較した結果は0(偽)または0以外の値(真)になります。C標準では「真」は厳密には1と定義されますが、多くの文脈で「0以外」を真として扱います。
- 比較そのものは元の変数を変更しません。あくまで「比べて結果を返すだけ」です。
- if文やwhile文の括弧内では、この真偽の結果が利用されて処理の分岐が行われます。
比較演算の簡単な例
#include <stdio.h>
int main(void) {
int a = 5;
int b = 3;
// a と b を比較して結果を表示する
printf("a == b の結果: %d\n", a == b); // 等しいか?
printf("a != b の結果: %d\n", a != b); // 等しくないか?
printf("a > b の結果: %d\n", a > b); // a の方が大きいか?
printf("a < b の結果: %d\n", a < b); // a の方が小さいか?
return 0;
}
a == b の結果: 0
a != b の結果: 1
a > b の結果: 1
a < b の結果: 0
このように、比較演算子は「条件式の部品」として、真(1)か偽(0)の値を返す役割を担っています。
== と = の違い
初心者が最初にハマりやすいのが「== と = を間違える」ことです。
記号は似ていますが、意味は全く異なります。

= は「代入演算子」
= は代入演算子です。
変数 = 値; のように書くことで「右辺の値を左辺の変数に入れる」という意味になります。
int x;
x = 5; // x に 5 を代入する(入れ替える)
== は「等しいかどうかの比較演算子」
== は比較演算子で、「左辺と右辺が等しいかどうか」を判定します。
(左辺 == 右辺) の形になり、結果は真(1)または偽(0)になります。
int x = 5;
int y = 5;
if (x == y) { // x と y が等しいかを比較する
printf("x と y は等しいです\n");
}
間違えるとどうなるか
間違えて if 文の条件式で = を使うと、意図しない代入が行われ、その結果(代入後の値)で条件判定が行われます。
#include <stdio.h>
int main(void) {
int x = 0;
// 本当は「x が 1 と等しいか?」を調べたいのに = を書いてしまった例
if (x = 1) { // ここは「比較」ではなく「代入」になる
printf("条件は真と判定されました\n");
}
printf("x の値: %d\n", x);
return 0;
}
条件は真と判定されました
x の値: 1
このコードでは、if の括弧内でx = 1が実行され、x に 1 が代入されます。
そしてその「代入結果の値」である 1 が条件式の値として評価されます。
1 は「真」とみなされるため、常に if の中が実行されてしまいます。
「条件式の中では == を使う」という意識を常に持つことが、バグを防ぐ第一歩です。
C言語でよく使う比較演算子一覧
C言語における代表的な比較演算子と、その意味を表にまとめます。
| 演算子 | 読み方の例 | 意味 | 例 | 結果 |
|---|---|---|---|---|
== | イコールイコール | 左右が等しければ真 | a == b | a と b が等しいとき真 |
!= | ノットイコール | 左右が等しくなければ真 | a != b | a と b が違うとき真 |
> | 大なり | 左が右より大きければ真 | a > b | a が b より大きいとき真 |
< | 小なり | 左が右より小さければ真 | a < b | a が b より小さいとき真 |
>= | 大なりイコール | 左が右以上なら真(大きいか等しい) | a >= b | a が b 以上のとき真 |
<= | 小なりイコール | 左が右以下なら真(小さいか等しい) | a <= b | a が b 以下のとき真 |
いくつかの例をコードで確認
#include <stdio.h>
int main(void) {
int a = 10;
int b = 10;
int c = 7;
printf("a == b: %d\n", a == b); // 10 と 10 は等しい → 1
printf("a != c: %d\n", a != c); // 10 と 7 は違う → 1
printf("c < a: %d\n", c < a); // 7 は 10 より小さい → 1
printf("c >= b: %d\n", c >= b); // 7 は 10 以上ではない → 0
return 0;
}
a == b: 1
a != c: 1
c < a: 1
c >= b: 0
比較演算子の優先順位と注意点
C言語では、複数の演算子を混ぜて書いたときに「どの演算子を先に計算するか」があらかじめ決められています。
これを演算子の優先順位と呼びます。
比較演算子は全体の中では中くらいの優先順位で、算術演算子(+、-)などよりは後ろに評価されます。
また、比較演算子同士にも優先順位の違いがあります。
| グループ | 演算子例 | 優先順位の高さ(上ほど高い) |
|---|---|---|
| 算術演算子 | * / % | 高い |
| 算術演算子 | + - | ↑ |
| 比較(大小) | < <= > >= | ↓ |
| 比較(等値) | == != | 低い |
| 論理演算子 AND | && | ↓ |
| 論理演算子 OR | || | さらに低い |
実務では「細かい優先順位を全部暗記する必要はありません」。
特に条件式では、少しでも迷ったら必ず括弧でくくるようにすることで、バグを防ぎつつ可読性も上がります。
注意したい書き方の例
int a = 5, b = 3, c = 10;
// これは (a < b) < c ではなく、(a < b) と (b < c) の比較
if (a < b < c) {
/* ... */
}
このような書き方は、Cでは意図どおりには動きません。
a < b がまず評価されて 0 または 1 になり、その結果と c を再び比較することになるためです。
こういう場合は必ず明示的に書き分ける必要があります。
if (a < b && b < c) { // 「a < b かつ b < c」であれば真
/* 正しい 3 つの値の大小関係がチェックできる */
}
比較演算子は、単体で使うときにはあまり問題になりませんが、複数を組み合わせるときには括弧で丁寧に書くことを心がけてください。
C言語の論理演算子とは?
論理演算子の基本
論理演算子は、主に「複数の条件を組み合わせる」ときに使う演算子です。
「A かつ B」「A または B」「A ではない」といった条件を表現できます。

代表的な論理演算子は次の3つです。
&&… 論理積(AND): 両方の条件が真のときだけ真||… 論理和(OR): どちらか一方でも真なら真!… 否定(NOT): 真偽を反転する
AND(&&)・OR(||)・NOT(!)の真理値
| A(左側の条件) | B(右側の条件) | A && B | A || B |
|---|---|---|---|
| 0(偽) | 0(偽) | 0 | 0 |
| 0(偽) | 1(真) | 0 | 1 |
| 1(真) | 0(偽) | 0 | 1 |
| 1(真) | 1(真) | 1 | 1 |
NOT 演算子は単一の条件に対して使います。
| A(条件) | !A |
|---|---|
| 0(偽) | 1(真) |
| 1(真) | 0(偽) |
&& と || の動作
論理AND(&&)と論理OR(||)は、複数の条件を組み合わせるときに頻繁に使います。
AND(&&): 「両方満たすときだけ」
#include <stdio.h>
int main(void) {
int age = 20;
int score = 80;
// 年齢が18歳以上 かつ 点数が70点以上なら合格
if (age >= 18 && score >= 70) {
printf("合格です\n");
} else {
printf("不合格です\n");
}
return 0;
}
この場合、age >= 18 と score >= 70 がどちらも真(1)のときだけ、全体の条件が真になります。
OR(||): 「どちらかを満たせば良い」
#include <stdio.h>
int main(void) {
int age = 16;
int hasParent = 1; // 保護者同伴フラグ(1なら同伴あり)
// 18歳以上 または 保護者同伴なら入場可
if (age >= 18 || hasParent == 1) {
printf("入場できます\n");
} else {
printf("入場できません\n");
}
return 0;
}
この場合、年齢条件が満たされていなくても、保護者同伴であれば入場できます。
どちらか一方でも真なら全体が真になるという性質があります。
論理演算子の短絡評価(short-circuit)とは
C言語の論理演算子には短絡評価(short-circuit evaluation)という性質があります。
「結果が決まった時点で、残りの評価を行わない」という最適化の動作です。

AND(&&)の短絡評価
A && B では、もし A が偽(0)なら、B を評価しなくても結果は必ず偽になると分かります。
そのため、C言語ではこの時点で B の評価をスキップします。
#include <stdio.h>
int main(void) {
int x = 0;
// 左側が偽(0)なので、右側の (10 / x) は評価されない
if (x == 0 && (10 / x) > 1) {
printf("条件は真です\n");
} else {
printf("条件は偽です\n");
}
return 0;
}
条件は偽です
このコードでは、本来 10 / x を実行すると 0 で割るためエラーになりますが、短絡評価のおかげでそもそも評価されません。
OR(||)の短絡評価
A || B では、もし A が真(0以外)なら、B を評価しなくても結果は必ず真になると分かります。
この場合も、C言語では B の評価をスキップします。
#include <stdio.h>
int f(void) {
printf("f() が呼ばれました\n");
return 1;
}
int main(void) {
int flag = 1;
if (flag == 1 || f() == 1) {
printf("条件は真です\n");
}
return 0;
}
条件は真です
このように、左側の条件で結果が確定する場合、右側は実行されません。
f() が呼ばれていないことが分かります。
短絡評価は便利ですが、「右側が必ず実行される」と思い込んで副作用(関数呼び出しや代入)を期待するとバグの元になります。
条件式の中であまり複雑な副作用を入れないことが、安全な書き方のコツです。
比較演算子と論理演算子の組み合わせ方
実際のプログラムでは、比較演算子と論理演算子を組み合わせて条件式を書くことがほとんどです。
ここで大事なのは「括弧でグループ分けをして、意図を明確にする」ことです。

例: 入力値のチェック
#include <stdio.h>
int main(void) {
int score;
int adminFlag;
printf("点数を入力してください: ");
scanf("%d", &score);
printf("管理者なら1を入力してください(それ以外は0): ");
scanf("%d", &adminFlag);
// 条件:
// ・点数が0~100点の範囲内 かつ
// ・点数が60点以上
// または
// ・管理者フラグが1
if ( (score >= 0 && score <= 100 && score >= 60) || adminFlag == 1 ) {
printf("合格とみなします\n");
} else {
printf("不合格です\n");
}
return 0;
}
この条件式は、次のように解釈できます。
- 通常の受験者なら「0~100点の範囲内で、なおかつ60点以上」なら合格
- 管理者フラグが1なら、点数に関係なく合格とみなす
このように、比較演算子(>=、<=、== など)で「単純な条件」を作り、論理演算子(&&、||)で「条件を組み合わせる」という分担になっています。
if文と条件式の書き方入門
if文での条件式の基本形
C言語の if 文は、次のような構造で書きます。
if (条件式) {
// 条件が真(1)のときに実行される処理
} else {
// 条件が偽(0)のときに実行される処理(省略可)
}
if の括弧内に入るのが「条件式」であり、ここで比較演算子や論理演算子が活躍します。
シンプルな if 文の例
#include <stdio.h>
int main(void) {
int x = 10;
if (x > 0) { // x が 0 より大きいか?
printf("x は正の数です\n");
} else {
printf("x は0または負の数です\n");
}
return 0;
}
複数条件を扱うif文の書き方
複数の条件を扱う場合、「if + else if + else」の形がよく使われます。
#include <stdio.h>
int main(void) {
int score;
printf("点数を入力してください: ");
scanf("%d", &score);
if (score >= 80) {
printf("評価: A\n");
} else if (score >= 60) {
printf("評価: B\n");
} else if (score >= 40) {
printf("評価: C\n");
} else {
printf("評価: D\n");
}
return 0;
}
ここでは、条件式の中で比較演算子>=を使い、上から順に条件を判定しています。
どれか一つの条件が真になった時点で、以降の else if や else は実行されません。
論理演算子と組み合わせた例
#include <stdio.h>
int main(void) {
int age;
int hasTicket;
printf("年齢を入力してください: ");
scanf("%d", &age);
printf("チケットを持っているなら1を入力してください: ");
scanf("%d", &hasTicket);
if (age >= 18 && hasTicket == 1) {
printf("入場可能です\n");
} else {
printf("入場できません\n");
}
return 0;
}
このように、複数の条件を組み合わせて、実際の業務ロジックに近い判定を行うことができます。
条件式でのよくあるミスと防ぎ方
条件式でありがちなミスと、その対策をいくつか紹介します。
1. == と = の書き間違い
すでに説明したように、比較と代入の混同は非常に多いミスです。
特に if 文の条件で=を書いてしまうと、意図しない代入が行われてしまいます。
「条件式の中では == を使う」と意識することに加えて、エディタのシンタックスハイライト(色分け表示)を活用すると、間違いに気づきやすくなります。
2. 比較を忘れて「そのまま変数を書く」
C言語では、if (x) と書くと「x が 0 以外なら真」と評価されます。
これは便利な一方で、初心者にとっては条件が分かりづらくなる原因にもなります。
// 良くない例(初心者には意味が伝わりにくい)
if (x) {
/* ... */
}
初心者のうちは、if (x != 0) のように明示的に比較演算子を書く方が読みやすく、安全です。
// 初心者向けの分かりやすい書き方
if (x != 0) {
/* x が 0 でないときの処理 */
}
3. 複雑すぎる条件式
1行で何でも書こうとして、非常に長く読みにくい条件式を書いてしまうこともよくあります。
// 読みにくい例
if (age >= 18 && age <= 65 && score >= 60 && score <= 100 && hasTicket == 1 && !isHoliday) {
/* ... */
}
途中の条件を変数に分けたり、括弧でグループ分けすることで、可読性を上げられます。
int isAdult = (age >= 18 && age <= 65);
int isValidScore = (score >= 60 && score <= 100);
if (isAdult && isValidScore && hasTicket == 1 && !isHoliday) {
/* ... */
}
可読性の高い条件式を書くコツ
可読性の高い条件式は、バグを減らし、後から読む自分や他人を助けてくれます。
次のようなポイントを意識すると良いです。
1. 括弧で「条件のまとまり」をはっきりさせる
// 括弧なし
if (a >= 0 && a <= 10 || b == 1) { /* ... */ }
// 括弧あり
if ( (a >= 0 && a <= 10) || b == 1 ) { /* ... */ }
後者の方が、「a の範囲チェック」と「b のチェック」の2つが OR で結ばれていることが一目で分かります。
2. 条件に名前を付ける(中間変数を使う)
int isAdult = (age >= 18);
int isStudent = (studentFlag == 1);
if (isAdult && isStudent) {
/* ... */
}
中間変数に意味のある名前を付けることで、英語の文章を読んでいるような感覚で条件式を理解できるようになります。
3. 正の条件を優先して書く
否定を重ねた条件式は分かりにくくなります。
// 分かりにくい例
if (!(x == 0)) { /* ... */ }
// 分かりやすい例
if (x != 0) { /* ... */ }
否定の否定のような表現はできるだけ避け、「こうである」という正の形で表現するように心がけると、可読性が上がります。
C言語初心者が覚えるべき条件式の基本パターン
範囲チェック
「点数が0~100の範囲にあるか」「年齢が20~64歳かどうか」といった範囲チェックは非常によく使います。

基本的な範囲チェックの形
#include <stdio.h>
int main(void) {
int score;
printf("点数を入力してください(0~100): ");
scanf("%d", &score);
if (score >= 0 && score <= 100) {
printf("有効な点数です\n");
} else {
printf("範囲外の点数です\n");
}
return 0;
}
「最小値以上 かつ 最大値以下」という形は、実務でも頻出のパターンです。
このとき、「0 <= score <= 100」のような数学っぽい書き方はCではできないので注意してください。
必ず論理ANDでつなげます。
フラグ変数と条件式の使い方
フラグ変数とは、「ある条件を満たしているかどうか」を 0/1 で持つ変数のことです。
論理演算子と非常に相性が良く、条件式を分かりやすく整理できます。
#include <stdio.h>
int main(void) {
int isMember; // 会員なら1, それ以外は0
int hasCoupon; // クーポンを持っていれば1
int isSaleDay; // セール日なら1
printf("会員なら1, それ以外は0: ");
scanf("%d", &isMember);
printf("クーポンを持っていれば1, なければ0: ");
scanf("%d", &hasCoupon);
printf("今日はセール日なら1, それ以外は0: ");
scanf("%d", &isSaleDay);
// 割引条件:
// ・会員 かつ クーポンあり
// または
// ・セール日
if ( (isMember == 1 && hasCoupon == 1) || isSaleDay == 1 ) {
printf("割引対象です\n");
} else {
printf("割引対象ではありません\n");
}
return 0;
}
フラグ変数を使うことで、「会員かどうか」「クーポンを持っているか」といった状態をシンプルに表現でき、条件式が組み立てやすくなります。
ループ(for・while)と条件式の関係
ループ(for、while)でも、「続けるか止めるか」を決めるために条件式が使われます。

while 文と条件式
#include <stdio.h>
int main(void) {
int i = 0;
// i が 5 未満の間、ループを続ける
while (i < 5) {
printf("i = %d\n", i);
i++; // i を1増やす
}
return 0;
}
ここでは、i < 5 という比較演算子の条件式が「ループ継続の条件」になっています。
条件式が偽(0)になった瞬間、ループは終了します。
for 文と条件式
#include <stdio.h>
int main(void) {
int i;
// for(初期化; 条件式; 変化式)
for (i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
return 0;
}
for 文の真ん中にあるのが条件式で、ここでもi < 5 という比較条件が使われています。
ループと条件式はセットで考えると理解が進みやすくなります。
条件式を使った簡単な実用例
最後に、比較演算子と論理演算子、if 文・ループを組み合わせた簡単な実用例を見てみます。
例: 配列の中から「0~100の範囲外の値」を検出する
#include <stdio.h>
int main(void) {
int data[] = { 50, -10, 80, 120, 30 };
int size = sizeof(data) / sizeof(data[0]);
int i;
printf("データ一覧:\n");
for (i = 0; i < size; i++) {
printf("%d ", data[i]);
}
printf("\n");
printf("0~100の範囲外の値:\n");
for (i = 0; i < size; i++) {
// 値が0~100の範囲外なら表示
if (data[i] < 0 || data[i] > 100) {
printf("%d (index %d)\n", data[i], i);
}
}
return 0;
}
データ一覧:
50 -10 80 120 30
0~100の範囲外の値:
-10 (index 1)
120 (index 3)
このプログラムでは、以下のように条件式が使われています。
for (i = 0; i < size; i++)… i が配列サイズより小さい間ループする(比較演算子)if (data[i] < 0 || data[i] > 100)… 範囲外かどうかを OR で判定(比較 + 論理演算子)
このように、比較演算子と論理演算子を組み合わせることで、実用的なチェック処理や検索処理が簡潔に書けるようになります。
まとめ
C言語の比較演算子と論理演算子は、if 文やループの条件式を作るための最重要パーツです。
「== と = の違い」「範囲チェックの書き方」「&& / || の短絡評価」などをきちんと理解しておくことで、条件式のバグを大きく減らせます。
初心者のうちは、括弧を使って条件のまとまりを明示し、フラグ変数や中間変数に名前を付けて可読性を高めることを意識すると良いです。
今回学んだパターンをベースに、実際のコードで条件式を書きながら少しずつ慣れていきましょう。
