C++の演算子
変数を使えばデータを保存できます。演算子を使えば、そのデータを操作できます――加算、比較、条件チェックなどです。演算子は、プログラミング言語における「動詞」のようなものだと考えてください。
1. 算術演算子
| 演算子 | 名称 | 例 | 結果 |
|---|---|---|---|
+ |
追加 | 10 + 3 |
13 |
- |
引き算 | 10 - 3 |
7 |
* |
乗算 | 10 * 3 |
30 |
/ |
部門 | 10 / 3 |
3 (⚠️) |
% |
剰余 | 10 % 3 |
1 |
(1) 整数除算の落とし穴
両方のオペランドが整数の場合、C++ は 整数除算 を行い(小数部を切り捨てて)、
CPP
int result = 10 / 3; // result is 3, NOT 3.333
double result2 = 10.0 / 3; // 3.33333 (at least one operand is 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) = 対 == の落とし穴
CPP
if (x = 5) { // ❌ Assignment, not comparison! x becomes 5
if (x == 5) { // ✅ Correct comparison
🔥 よくある間違い:
= は代入、== は比較です。条件式で誤って = を使用すると、値を評価する代わりに代入されてしまいます。その結果、条件は常に true となります(ゼロ以外の値は真とみなされるため)。
3. 論理演算子
ブール条件を組み合わせたり、反転させたりします。
| 演算子 | 名称 | 例 | 結果 |
|---|---|---|---|
&& |
AND | (5 > 3) && (5 < 10) |
true |
|| |
または | (5 > 3) || (5 > 10) |
true |
! |
NOT | !(5 > 3) |
false |
(1) 短絡評価
C++は「遅延評価」を行う言語であり、結果が確定した時点で評価を停止します:
false && anything→false(右辺は評価されない)true || anything→true(右辺は評価されない)
CPP
int x = 0;
if (x != 0 && 10 / x > 1) { // Safe! The second part is never evaluated when x is 0
(2) ▶ サンプル:1:閏年チェッカー(難易度 ⭐)
CPP
#include iostream
int main() {
int year;
std::cout << "Enter a year: ";
std::cin >> year;
bool isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeap) {
std::cout << year << " is a leap year." << std::endl;
} else {
std::cout << year << " is not a leap 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 (use x first, then increment)
int a = 5;
int b = ++a; // b = 6, a = 6 (increment first, then use)
(1) ▶ サンプル:2:プレフィックスとポストフィックス(難易度 ⭐⭐)
CPP
#include iostream
int main() {
int x = 5;
std::cout << "x++: " << x++ << std::endl; // Output: 5 (then x becomes 6)
std::cout << "Now x: " << x << std::endl; // Output: 6
int y = 5;
std::cout << "++y: " << ++y << std::endl; // Output: 6 (y becomes 6 first)
return 0;
}
6. 演算子の優先順位
数学と同じように、C++の演算子にも優先順位があります。迷ったときは、括弧を使うようにしましょう!
| 優先順位 | 演算子 | 備考 |
|---|---|---|
| 1 (最高) | () `` -> . |
関数呼び出し、配列インデックス、メンバアクセス |
| 2 | ++ -- ! + - (単項) |
接頭辞インクリメント、論理否定 |
| 3 | * / % |
乗算、除算、剰余 |
| 4 | + - |
足し算、引き算 |
| 5 | < <= > >= |
関係比較 |
| 6 | == != |
等価性チェック |
| 7 | && |
論理 AND |
| 8(最低) | || |
論理OR |
(1) ▶ サンプル:3:演算子の優先順位(難易度 ⭐⭐)
CPP
int result = 5 + 3 * 2; // 11 (not 16!) because * has higher precedence
int result2 = (5 + 3) * 2; // 16 (parentheses override precedence)
bool check = 5 > 3 && 2 < 4; // true (relational before logical)
💡 ヒント: 演算子の優先順位がわからない場合は、単に括弧を付けるだけで済みます。プログラムの実行速度は落ちず、コードを読む人にとって意図が明確に伝わります。
(2) ▶ サンプル:4:難易度分類(難易度 ⭐⭐)
CPP
#include iostream
int main() {
int score;
std::cout << "Enter your score (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 << "Your grade is: " << grade << std::endl;
return 0;
}
▶ サンプル 1: operators overviewデモ (難易度 ⭐)
CPP
#include <iostream>
int main() {
// operators overviewの
std::cout << "operators overviewをびましょう!" << std::endl;
return 0;
}
❓ よくある質問
Q なぜ 10 / 3 は 3.3333 ではなく 3 になるのですか?
A 両方のオペランドが整数であるため、C++ は整数除算を行い、小数部分を切り捨てます。小数結果を得るには、少なくとも一方のオペランドを double 型にします(例:
10.0 / 3)。Q % 演算子は負の数でも使用できますか?
A はい、使用できますが、結果の符号は除数によって異なります(C++11 標準)。ベストプラクティスとして、予期せぬ結果を避けるため、
% を使用する際は正の整数に限定することをお勧めします。Q なぜ
5 < x < 10 と記述できないのですか?A これは数学的には正しいですが、C++の論理としては正しくないためです。代わりに
5 < x && x < 10 を使用してください。これは、論理ANDで接続された2つの比較式です。Q i++ と ++i の実際の違いは何ですか?
A 単純な int 型の変数の場合、どちらを使ってもコンパイル後のコードは同じになります。イテレータやカスタム型の場合、
++i の方が効率的です(一時的なコピーが不要)。i++ を使う特別な理由がない場合は、++i を使用することをお勧めします。📖 まとめ
- C++には、算術演算子、比較演算子、論理演算子、代入演算子、インクリメント/デクリメント演算子の5つのカテゴリがあります。
- 整数除算では小数部分が切り捨てられます。精度が必要な場合は
doubleを使用してください =と==を絶対に混同しないでください — これは C++ で最もよくあるバグの一つです++iはまずインクリメントを行い、その後戻る;i++はまず戻り、その後インクリメントを行う- 優先順位がわからない場合は、括弧を付ける
📝 練習問題
-
初心者(難易度 ⭐): 2つの整数を入力を受け取り、それらの和、差、積、商、余りを表示するプログラムを作成してください。
-
中級(難易度 ⭐⭐): 3桁の数字(例:365)を入力してもらい、各桁(百の位、十の位、一の位)を別々に表示するプログラムを作成してください。
-
上級(難易度 ⭐⭐⭐): 数字当てゲームを作成してください。プログラムは1から100までの間の乱数を生成し、ユーザーはその数字を当てる必要があります。推測するたびに、正解がわかるまでプログラムは「高すぎます!」または「低すぎます!」と表示します。



