C++: C++の演算子
最終更新:2026-08-31
変数はデータを格納する。演算子はデータを操作する——足す、比較する、条件をチェックするなど。演算子はプログラミング言語の「動詞」のようなもの。
1. 算術演算子
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
+ |
加算 | 10 + 3 |
13 |
- |
減算 | 10 - 3 |
7 |
* |
乗算 | 10 * 3 |
30 |
/ |
除算 | 10 / 3 |
3(⚠️) |
% |
剰余(余り) | 10 % 3 |
1 |
(1) 整数割り算の罠
両方のオペランドが整数の場合、C++は整数割り算を実行(小数を切り捨て):
CPP
int result = 10 / 3; // 結果は3、3.333ではない
double result2 = 10.0 / 3; // 3.33333(少なくとも片方はdouble)
⚠️ 注意: これは初心者に最も多いバグの一つ。小数結果が必要な場合、少なくとも片方のオペランドを
doubleにする。
(2) 剰余演算子(%)
%は割り算の余りを返す。以下の用途に便利:
- 奇数・偶数判定:
n % 2 == 0なら偶数 - 桁の取得:
365 % 10は5(最後の桁) - 範囲のループ
2. 関係(比較)演算子
値を比較するために使用。結果は常にbool(trueまたはfalse)。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
== |
等しい | 5 == 3 |
false |
!= |
等しくない | 5 != 3 |
true |
< |
より小さい | 5 < 3 |
false |
> |
より大きい | 5 > 3 |
true |
<= |
以下 | 5 <= 5 |
true |
>= |
以上 | 5 >= 3 |
true |
(1) = vs == の罠
CPP
if (x = 5) { // ❌ 代入!比較ではない!xが5になる
if (x == 5) { // ✅ 正しい比較
🔥 よくある間違い:
=は代入、==は比較。条件で間違って=を使うと、値を代入してしまい——条件は常にtrueになる(非ゼロ値は真だから)。
3. 論理演算子
ブール条件を組み合わせたり反転させる。
| 演算子 | 名前 | 例 | 結果 |
|---|---|---|---|
&& |
AND | (5 > 3) && (5 < 10) |
true |
| ` | ` | OR | |
! |
NOT | !(5 > 3) |
false |
(1) 短絡評価
C++は怠け者——結果が確定すると評価を止める:
false && 何でも→false(右側は評価しない)true || 何でも→true(右側は評価しない)
TEXT
📖 参照専用
int x = 0;
if (x != 0 && 10 / x > 1) { // 安全!xが0のとき2番目の部分は評価されない
▶ サンプル 1:うるう年判定(難易度 ⭐)
CPP
#include <iostream>
int main() {
int year;
std::cout << "年を入力: ";
std::cin >> year;
bool isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeap) {
std::cout << year << "年はうるう年です。" << std::endl;
} else {
std::cout << year << "年はうるう年ではありません。" << std::endl;
}
return 0;
}
4. 代入演算子
| 演算子 | 例 | 同じ意味 |
|---|---|---|
= |
x = 5; |
x = 5 |
+= |
x += 3; |
x = x + 3 |
-= |
x -= 3; |
x = x - 3 |
*= |
x *= 3; |
x = x * 3 |
/= |
x /= 3; |
x = x / 3 |
%= |
x %= 3; |
x = x % 3 |
5. インクリメントとデクリメント
| 演算子 | 名前 | 例 | 効果 |
|---|---|---|---|
++ |
インクリメント | x++または++x |
1増やす |
-- |
デクリメント | x--または--x |
1減らす |
前置と後置の違い:
| 式 | 名前 | 振る舞い |
|---|---|---|
x++ |
後置インクリメント | 現在の値を使ってから、増やす |
++x |
前置インクリメント | 先に増やしてから、新しい値を使う |
CPP
int x = 5;
int y = x++; // y = 5, x = 6(xを使ってから増やす)
int a = 5;
int b = ++a; // b = 6, a = 6(先に増やしてから使う)
▶ サンプル 2:前置と後置(難易度 ⭐⭐)
CPP
#include <iostream>
int main() {
int x = 5;
std::cout << "x++: " << x++ << std::endl; // 出力: 5(その後xは6になる)
std::cout << "今のx: " << x << std::endl; // 出力: 6
int y = 5;
std::cout << "++y: " << ++y << std::endl; // 出力: 6(先にyが6になる)
return 0;
}
6. 演算子の優先順位
数学と同様、C++の演算子には優先順位がある。迷ったら括弧を使おう!
| 優先度 | 演算子 | 備考 |
|---|---|---|
| 1(最高) | () [] -> . |
関数呼び出し、配列添字、メンバーアクセス |
| 2 | ++ -- ! + -(単項) |
前置インクリメント、論理否定 |
| 3 | * / % |
乗算、除算、剰余 |
| 4 | + - |
加算、減算 |
| 5 | < <= > >= |
関係比較 |
| 6 | == != |
等価比較 |
| 7 | && |
論理AND |
| 8(最低) | ` |
▶ サンプル 3:演算子の優先順位(難易度 ⭐⭐)
CPP
int result = 5 + 3 * 2; // 11(16ではない!)*の方が優先順位が高い
int result2 = (5 + 3) * 2; // 16(括弧が優先順位を上書き)
bool check = 5 > 3 && 2 < 4; // true(関係演算子が論理演算子より先)
💡 ヒント: 優先順位に自信がなければ、括弧を追加しよう。プログラムは遅くならず、意図が読み手に明確に伝わる。
▶ サンプル 4:成績分類(難易度 ⭐⭐)
CPP
#include <iostream>
int main() {
int score;
std::cout << "スコアを入力 (0-100): ";
std::cin >> score;
char grade;
if (score >= 90) grade = 'A';
else if (score >= 80) grade = 'B';
else if (score >= 70) grade = 'C';
else if (score >= 60) grade = 'D';
else grade = 'F';
std::cout << "成績: " << grade << std::endl;
return 0;
}
❓ よくある質問
Q なぜ10 / 3 = 3なの?3.333じゃない?
A 両方のオペランドが整数なので、C++は整数割り算を実行し、小数を切り捨て。小数結果が必要な場合、少なくとも片方のオペランドをdoubleにする(例:
10.0 / 3)。Q 負の数で%は使える?
A 使えるが、結果の符号は被除数による(C++11標準)。ベストプラクティス:
%を使うときは正の整数に限り、驚きを避ける。Q なぜ
5 < x < 10と書けない?A それは有効な数学だが、有効なC++のロジックではない。
5 < x && x < 10と書く——2つの比較を論理ANDで繋ぐ。Q i++と++iの本当の違いは?
A 単純なint変数の場合、コンパイルされたコードはどちらも同じ。イテレータやカスタム型の場合、
++iの方が効率的(一時コピーが不要)。特別な理由がなければ++iを推奨。📖 まとめ
- C++には5つの演算子カテゴリ:算術、関係、論理、代入、インクリメント・デクリメント
- 整数割り算は小数を切り捨て——精度が必要なら
doubleを使う =と==を混同しない——最も多いC++バグの一つ++iは先に増やしてから返す;i++は返してから増やす- 優先順位に自信がないときは括弧を追加
📝 練習問題
-
初級(難易度 ⭐): 2つの整数を尋ね、和、差、積、商、余りを出力するプログラムを書く。
-
中級(難易度 ⭐⭐): 3桁の数(例:365)を尋ね、各桁を別々に出力(百の位、十の位、一の位)。
-
上級(難易度 ⭐⭐⭐): 数当てゲームを書く:プログラムが1〜100の乱数を生成し、ユーザーが当てる。各推測の後、「高すぎる!」または「低すぎる!」と言い、正解を見つけるまで続ける。