C言語の演算子の種類を完全網羅!初心者向けに使い方を徹底解説

2025年4月14日月曜日

C言語

C言語の演算子の種類、たくさんあって最初は戸惑いますよね?

プログラムを書く上で計算したり、比べたり、条件を判断したり…そんな時に絶対使うのが演算子なんです。

この記事では、C言語の基本的な演算子から、ちょっとだけ応用的なものまで、それぞれの意味と使い方を、初心者の方に向けて分かりやすく解説していきます!

サンプルコードと実行結果を見ながら、実際にどう動くのか掴んでいきましょう。

この記事で学べること

  • 演算子がC言語でどんな役割を果たすかが分かる
  • 算術、関係、論理など、主要な演算子の種類と使い方が身につく
  • 実際のコード例で演算子の動きを確認できる
  • 演算子の優先順位や初心者が気をつけたいポイントが分かる
  • 演算子を理解して、プログラム作成の幅が広がる

C言語の演算子とは?プログラムを動かす部品を理解しよう

演算子って、なんだか難しそうに聞こえるかもしれません。

でも、実は小学校で習った算数の記号、例えば「+」や「-」みたいなものと似ています。
C言語のプログラムの中で、変数や値を使って何か処理(計算したり、比較したり、値を代入したり)をするための記号、それが演算子です。

例えば、`5 + 3` という式があったら、「+」が演算子ですね。

C言語では、数字だけでなく、変数というデータを入れておく箱とも組み合わせて使います。
`score = score + 10;` みたいに書けば、「score」という変数の中身に10を足して、また「score」に戻す、なんてことができます。

プログラムが色々な動きをするための、まさに縁の下の力持ち、それが演算子だとイメージしてくださいね。

C言語の演算子の種類はこれを押さえればOK!主要カテゴリ一覧

C言語には色々な演算子がありますが、全部を一気に覚えるのは大変!

まずは、よく使う主要なグループ(カテゴリ)から押さえていきましょう。
この記事では、以下のカテゴリの演算子を中心に解説を進めます。

  • 算術演算子 - 足し算や引き算など、計算をする仲間たち
  • 関係演算子 - 大きい、小さい、等しいなど、比べるのが得意な仲間たち
  • 論理演算子 - 「かつ」や「または」で、条件を組み合わせる仲間たち
  • 代入演算子 - 変数に値を入れる(代入する)ための仲間たち
  • インクリメント・デクリメント演算子 - 値を1だけ増やしたり減らしたりする便利な仲間たち
  • ビット演算子 - コンピュータ内部の0と1を直接扱う、ちょっと玄人向けの仲間たち
  • その他(条件演算子、sizeof演算子など) - 特定の場面で役立つ仲間たち

これらの演算子の種類と役割を理解することが、C言語を使いこなす第一歩です。
一つずつ見ていきましょう!

【算術演算子】計算の基本

まずは、一番イメージしやすい算術演算子から。
普段使っている計算記号とほぼ同じです。

  • `+` (加算): 足し算をします。 例: `5 + 3` は `8`
  • `-` (減算): 引き算をします。 例: `5 - 3` は `2`
  • `*` (乗算): 掛け算をします。 例: `5 * 3` は `15`
  • `/` (除算): 割り算をします。 例: `5 / 3` は `1` (整数同士だと小数点以下は切り捨て!)
  • `%` (剰余): 割り算の余りを求めます。 例: `5 % 3` は `2` (5割る3は1、余り2)

書き方とソースコード例を見てみましょう。

#include <stdio.h>

int main(void) {
  int a = 10;
  int b = 3;
  double c = 10.0;
  double d = 3.0;

  printf("a + b = %d\n", a + b);     // 足し算
  printf("a - b = %d\n", a - b);     // 引き算
  printf("a * b = %d\n", a * b);     // 掛け算
  printf("a / b = %d\n", a / b);     // 割り算 (整数)
  printf("a %% b = %d\n", a % b);    // 余り (%%で%を表示)
  printf("c / d = %f\n", c / d);     // 割り算 (小数)

  return 0;
}

ソースコードの表示結果:

a + b = 13
a - b = 7
a * b = 30
a / b = 3
a % b = 1
c / d = 3.333333

整数同士の割り算 `/` は、結果も整数になる(小数点以下は切り捨てられる)点に注意してくださいね。
小数点以下まで計算したい場合は、`double` 型など、小数点を扱える型を使う必要があります。

【関係演算子】大小や等しさを比較する

次に、2つの値の関係(大きいか、小さいか、同じかなど)を調べる関係演算子です。
結果は、「条件が正しい(真)」か「条件が間違っている(偽)」かで返ってきます。
C言語では、真は `1`、偽は `0` という整数で表現されるのが一般的です。

  • `==` (等しい): 2つの値が等しいか調べます。 例: `5 == 3` は 偽 (`0`)
  • `!=` (等しくない): 2つの値が等しくないか調べます。 例: `5 != 3` は 真 (`1`)
  • `>` (より大きい): 左辺が右辺より大きいか調べます。 例: `5 > 3` は 真 (`1`)
  • `<` (より小さい): 左辺が右辺より小さいか調べます。 例: `5 < 3` は 偽 (`0`)
  • `>=` (以上): 左辺が右辺以上か調べます。 例: `5 >= 5` は 真 (`1`)
  • `<=` (以下): 左辺が右辺以下か調べます。 例: `5 <= 3` は 偽 (`0`)

特に `if` 文という、条件によって処理を分ける構文でよく使われます。
使い方とソースコード例です。

#include <stdio.h>

int main(void) {
  int age = 20;
  int score = 75;

  printf("age == 20 の結果: %d\n", age == 20);
  printf("score != 75 の結果: %d\n", score != 75);
  printf("score > 60 の結果: %d\n", score > 60);

  if (age >= 20) {
    printf("あなたは成人です。\n");
  } else {
    printf("あなたは未成年です。\n");
  }

  // 注意! = は代入、 == が比較
  if (score = 60) { // これは比較ではなく、scoreに60を代入している(間違いやすい!)
     printf("score に 60 が代入されました。(結果は常に真と評価されやすい)\n");
  }
   if (score == 60) { // 正しい比較
     printf("score は 60 です。\n"); // 上で代入されたので、ここは実行される
  }


  return 0;
}

ソースコードの表示結果:

age == 20 の結果: 1
score != 75 の結果: 0
score > 60 の結果: 1
あなたは成人です。
score に 60 が代入されました。(結果は常に真と評価されやすい)
score は 60 です。

一番気をつけたいのが、`=` (代入演算子) と `==` (関係演算子) の間違い!
`if (score = 60)` と書いてしまうと、「score に 60 を代入する」処理になり、多くの場合、条件式は真 (`1`) と評価されてしまいます。

比較したいときは、必ず `==` を使うようにしましょう。

【論理演算子】複数の条件を組み合わせる

関係演算子などで作った条件を、さらに組み合わせて複雑な判断をしたいときに使うのが論理演算子です。
「A かつ B」とか「A または B」とか、「A でない」といった条件を作れます。

  • `&&` (論理AND): 左右の条件が両方とも真のときだけ、全体が真 (`1`) になります。 例: `(5 > 3) && (5 < 10)` は 真 (`1`)
  • `||` (論理OR): 左右の条件のどちらか一方でも真なら、全体が真 (`1`) になります。 例: `(5 < 3) || (5 > 1)` は 真 (`1`)
  • `!` (論理NOT): 条件の真偽を反転させます。真なら偽 (`0`) に、偽なら真 (`1`) になります。 例: `!(5 == 3)` は 真 (`1`)

例えば、「年齢が20歳以上 かつ 65歳未満」みたいな条件を作るのに使います。
使い方とソースコード例を見てみましょう。

#include <stdio.h>

int main(void) {
  int age = 30;
  int score = 80;

  // 年齢が20歳以上 かつ 65歳未満 かどうか
  if (age >= 20 && age < 65) {
    printf("あなたは現役世代です。\n");
  } else {
    printf("あなたは現役世代ではありません。\n");
  }

  // スコアが0点 または 100点 かどうか
  if (score == 0 || score == 100) {
    printf("スコアは0点または100点です。\n");
  } else {
    printf("スコアは0点でも100点でもありません。\n");
  }

  // 年齢が20歳未満 でない かどうか (つまり20歳以上か)
  if (!(age < 20)) {
    printf("年齢は20歳以上です。(NOT使用)\n");
  }

  return 0;
}

ソースコードの表示結果:

あなたは現役世代です。
スコアは0点でも100点でもありません。
年齢は20歳以上です。(NOT使用)

論理演算子を使いこなせると、プログラムの条件分岐をより柔軟に書けるようになりますよ。

【代入演算子】変数に値を効率よく代入する

変数に値を入れる(代入する)ための演算子です。
一番基本的なのは `=` ですね。

`int score = 100;` // 変数 score に 100 を代入

これに加えて、計算と代入を一緒に行う「複合代入演算子」があります。
コードを少し短く書けるので便利です。

  • `=` (代入): 右辺の値を左辺の変数に代入します。
  • `+=` (加算代入): `a += b` は `a = a + b` と同じ。
  • `-=` (減算代入): `a -= b` は `a = a - b` と同じ。
  • `*=` (乗算代入): `a *= b` は `a = a * b` と同じ。
  • `/=` (除算代入): `a /= b` は `a = a / b` と同じ。
  • `%=` (剰余代入): `a %= b` は `a = a % b` と同じ。

`a = a + 5;` を `a += 5;` と書ける、という感じです。

書き方と使い方を見てみましょう。

#include <stdio.h>

int main(void) {
  int score = 50;
  int bonus = 10;

  printf("最初の score: %d\n", score);

  score = score + bonus; // 通常の加算と代入
  printf("score + bonus 後: %d\n", score);

  score = 50; // 元に戻す
  score += bonus; // 加算代入を使用
  printf("score += bonus 後: %d\n", score);

  int count = 10;
  count *= 2; // count = count * 2; と同じ
  printf("count *= 2 後: %d\n", count);

  return 0;
}

ソースコードの表示結果:

最初の score: 50
score + bonus 後: 60
score += bonus 後: 60
count *= 2 後: 20

最初は普通の書き方でも全く問題ありませんが、慣れてきたら複合代入演算子も使ってみると、コードがスッキリします。

【インクリメント・デクリメント演算子】1増やす・1減らす処理

変数の値を `1` だけ増やしたり (`++`)、`1` だけ減らしたり (`--`) する専用の演算子です。
ループ処理などでカウンター変数によく使われます。

この演算子には、変数名の前につける「前置」と、後につける「後置」があり、動作が少し違うのがポイントです!

  • `++a` (前置インクリメント): `a` の値を 1増やしてから、式全体の値として `a` の新しい値を使います。
  • `a++` (後置インクリメント): 式全体の値として `a` の元の値を使い、その後で `a` の値を 1増やします。
  • `--a` (前置デクリメント): `a` の値を 1減らしてから、式全体の値として `a` の新しい値を使います。
  • `a--` (後置デクリメント): 式全体の値として `a` の元の値を使い、その後で `a` の値を 1減らします。

言葉だと分かりにくいので、実際のコードで動きを見てみましょう。

#include <stdio.h>

int main(void) {
  int pre_a = 5;
  int post_a = 5;
  int pre_b = 5;
  int post_b = 5;

  int result_pre = ++pre_a; // 前置: pre_aを6にしてからresult_preに代入
  int result_post = post_a++; // 後置: result_postに元の5を代入してからpost_aを6にする

  printf("前置インクリメント:\n");
  printf("  pre_a の値: %d\n", pre_a);        // 6
  printf("  result_pre の値: %d\n", result_pre);  // 6

  printf("後置インクリメント:\n");
  printf("  post_a の値: %d\n", post_a);       // 6
  printf("  result_post の値: %d\n", result_post); // 5 (元の値)

  // デクリメントも同様
  int result_pre_dec = --pre_b; // 前置: pre_bを4にしてからresult_pre_decに代入
  int result_post_dec = post_b--; // 後置: result_post_decに元の5を代入してからpost_bを4にする

  printf("前置デクリメント:\n");
  printf("  pre_b の値: %d\n", pre_b);           // 4
  printf("  result_pre_dec の値: %d\n", result_pre_dec); // 4

  printf("後置デクリメント:\n");
  printf("  post_b の値: %d\n", post_b);          // 4
  printf("  result_post_dec の値: %d\n", result_post_dec); // 5 (元の値)

  return 0;
}

ソースコードの表示結果:

前置インクリメント:
  pre_a の値: 6
  result_pre の値: 6
後置インクリメント:
  post_a の値: 6
  result_post の値: 5
前置デクリメント:
  pre_b の値: 4
  result_pre_dec の値: 4
後置デクリメント:
  post_b の値: 4
  result_post_dec の値: 5

特に後置 `a++` や `a--` を含む式では、「式全体で使われる値」と「その後の変数の値」が異なるので、混乱しないように気をつけましょう。

複雑な式の中で使うと、意図しない結果(副作用)を生むこともあるため、最初はシンプルに単独で `count++;` のように使うのがおすすめです。

【ビット演算子:ビット単位の操作】

ここは少し応用的な内容になります。

ビット演算子は、コンピュータが内部でデータを扱う最小単位である「ビット」(0か1)を直接操作するための演算子です。

普段のプログラミングではあまり使いませんが、ハードウェアに近い制御や、特定の処理を高速化したい場合などに使われることがあります。

  • `&` (ビットAND): 対応するビットが両方1なら1。
  • `|` (ビットOR): 対応するビットのどちらか一方が1なら1。
  • `^` (ビットXOR): 対応するビットが異なれば1。
  • `~` (ビットNOT): ビットを反転させます(0は1に、1は0に)。
  • `<<` (左シフト): ビット列を左に指定数ずらします(値を2倍にするのと同じ効果)。
  • `>>` (右シフト): ビット列を右に指定数ずらします(値を1/2にするのと同じ効果)。

例えば、`5` は2進数で `0101`、`3` は `0011` と表現できます(ここでは4ビットで表現)。

`5 & 3` は `0101 & 0011` となり、各ビットをAND演算すると `0001` (10進数で 1) になります。
`5 | 3` は `0101 | 0011` となり、各ビットをOR演算すると `0111` (10進数で 7) になります。

こういう演算があるんだな、程度に知っておけば、今の段階では十分です。
必要になったときに、改めて詳しく調べてみましょう。

簡単なシフト演算の例だけ見てみましょう。

#include <stdio.h>

int main(void) {
  unsigned char num = 5; // 2進数で 00000101

  printf("元の値: %d (2進数: 00000101)\n", num);

  unsigned char left_shifted = num << 1; // 1ビット左シフト
  printf("1ビット左シフト: %d (2進数: 00001010)\n", left_shifted); // 10 になる (5 * 2)

  unsigned char right_shifted = num >> 1; // 1ビット右シフト
  printf("1ビット右シフト: %d (2進数: 00000010)\n", right_shifted); // 2 になる (5 / 2 の整数部)

  return 0;
}

ソースコードの表示結果:

元の値: 5 (2進数: 00000101)
1ビット左シフト: 10 (2進数: 00001010)
1ビット右シフト: 2 (2進数: 00000010)

C言語 演算子の優先順位と結合規則:計算の順番ルール

一つの式の中に複数の演算子がある場合、どの計算から先に行うか、というルールがあります。
それが「優先順位」と「結合規則」です。

例えば、`a = 5 + 3 * 2;` という式があったらどうでしょう?
もし左から順番に計算すると `(5 + 3) * 2` で `16` になります。

でも、算数で習ったように、普通は掛け算が優先ですよね? C言語でも同じで、`3 * 2` が先に計算されて `6` になり、次に `5 + 6` で `11` となります。

このように、演算子には優先される順番が決まっています。
主な優先順位の高いものからいくつか挙げると…

  1. `()` (括弧) - 括弧の中が最優先!
  2. `++`, `--`, `!` (単項演算子)
  3. `*`, `/`, `%` (乗算、除算、剰余)
  4. `+`, `-` (加算、減算)
  5. `<`, `<=`, `>`, `>=` (関係演算子)
  6. `==`, `!=` (等価演算子)
  7. `&&` (論理AND)
  8. `||` (論理OR)
  9. `=`, `+=`, `-=` など (代入演算子)

優先順位が同じ演算子が並んでいる場合は、「結合規則」に従って計算されます。
多くの演算子(算術演算子や関係演算子など)は「左結合」で、左から順に計算されます。

例えば `10 / 2 * 5` は、`(10 / 2) * 5` となり `25` です。
代入演算子や単項演算子などは「右結合」で、右から順に評価されます。

「優先順位がややこしいな…」と感じたら、迷わず括弧 `()` を使いましょう!
括弧で囲んだ部分が先に計算されるので、計算順序を明確に指定できます。

例えば、`a = (5 + 3) * 2;` と書けば、足し算が先に行われることが一目瞭然です。
コードを読む人にとっても分かりやすくなるので、括弧は積極的に使うのがおすすめです。

C言語の演算子を使いこなすための注意点

ここまで色々な演算子を見てきましたが、初心者のうちにつまずきやすいポイントをいくつかまとめておきます。

これらを意識するだけで、バグ(プログラムの誤り)を減らせるはずです!

  • 整数除算に気をつける
    `5 / 2` は `2.5` ではなく `2` になります。小数点以下まで計算したい場合は、`5.0 / 2.0` のように、少なくともどちらか一方を小数点が扱える型(`double` や `float`)にする必要があります。
  • 比較は `==`、代入は `=`
    これは本当に良くある間違い! `if (a = 5)` と書くと、比較ではなく代入になってしまいます。比較のときは必ず `==` を使ってください。
  • インクリメント/デクリメントの副作用
    `a++` や `a--` を含む複雑な式は、値がいつ変化するのか分かりにくくなることがあります。最初は `a++;` のように、単独で使うのが安全です。
  • ビット演算子は理解してから使う
    `&` と `&&`、`|` と `||` は意味が全く違います。ビット演算は特殊な場面で使うものなので、よく分からないうちは無理に使わないようにしましょう。
  • 優先順位を意識する、迷ったら括弧!
    意図しない計算順序になっていないか確認しましょう。少しでも自信がない場合は、括弧 `()` を使って計算順序を明示するのが一番確実で、コードも読みやすくなります。

これらの点に気をつけて、演算子と仲良くなっていきましょう!

【まとめ】C言語の演算子の種類を理解してプログラムの可能性を広げよう!

今回は、C言語の演算子の種類について、基本的なものから少し応用的なものまで解説しました。

算術演算子で計算し、関係演算子で比較し、論理演算子で条件を組み合わせ、代入演算子で値を記憶する…演算子はプログラムを組み立てる上で、なくてはならない部品です。

それぞれの演算子の意味と使い方、そして優先順位や注意点を理解することで、あなたが書くC言語のプログラムは、もっと意図した通りに、そして正確に動くようになるはずです。
最初は覚えることが多く感じるかもしれませんが、実際にコードを書きながら使っていくうちに、自然と身についていきます。

この記事が、あなたのC言語学習の一助となれば嬉しいです。

どんどんコードを書いて、試して、演算子を自分のものにしていってくださいね!


【関連記事】

>> C言語とは?特徴・できること・学ぶメリット

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ