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) 剰余演算子(%)

%は割り算の余りを返す。以下の用途に便利:



2. 関係(比較)演算子

値を比較するために使用。結果は常にbooltrueまたは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++は怠け者——結果が確定すると評価を止める:

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を推奨。

📖 まとめ


📝 練習問題

  1. 初級(難易度 ⭐): 2つの整数を尋ね、和、差、積、商、余りを出力するプログラムを書く。

  2. 中級(難易度 ⭐⭐): 3桁の数(例:365)を尋ね、各桁を別々に出力(百の位、十の位、一の位)。

  3. 上級(難易度 ⭐⭐⭐): 数当てゲームを書く:プログラムが1〜100の乱数を生成し、ユーザーが当てる。各推測の後、「高すぎる!」または「低すぎる!」と言い、正解を見つけるまで続ける。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%