% の意味と使い方を復習する演算子(operator)とは、値に対して演算を行う記号です。C言語では、計算や比較などを行うためにさまざまな演算子が用意されています。
例: +(加算)、*(乗算)、==(等しい)など
C言語の基本的な数値演算は以下の算術演算子で行います。ここでは簡単に復習として確認します。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
+ |
加算 | 3 + 2 |
5 |
- |
減算 | 3 - 2 |
1 |
* |
乗算 | 3 * 2 |
6 |
/ |
除算 | 7 / 2 |
3(整数同士なら切り捨て) |
% |
剰余 | 7 % 2 |
1(余り) |
🔸 % は整数同士にしか使えません。実数(floatやdouble)と一緒に使うとコンパイルエラーになります。
複合代入演算子は、「演算を行い、その結果を同じ変数に代入する」ための短縮記法です。
x += 3; // x = x + 3 と同じ意味
x *= 2; // x = x * 2 と同じ意味
ファイル名:08-6_compound_assignment.c
#include <stdio.h>
int main(void) {
int a = 5;
a += 3;
printf("a = %d\n", a); // a = 8
int b = 10;
b -= 4;
printf("b = %d\n", b); // b = 6
int c = 3;
c *= 4;
printf("c = %d\n", c); // c = 12
int d = 20;
d /= 5;
printf("d = %d\n", d); // d = 4
int e = 13;
e %= 5;
printf("e = %d\n", e); // e = 3
return 0;
}
出力結果:
a = 8
b = 6
c = 12
d = 4
e = 3
インクリメント(++)とデクリメント(--)は、変数の値をそれぞれ 1 増やす/減らす単項演算子です。
これらには 前置 と 後置 の2つの使い方があります。
| 演算子 | タイミング | 例 | 動作 |
|---|---|---|---|
++x |
前置インクリメント | y = ++x; |
x を 1 増やしてから y に代入 |
x++ |
後置インクリメント | y = x++; |
y に x を代入したあと x を 1 増やす |
--x |
前置デクリメント | y = --x; |
x を 1 減らしてから y に代入 |
x-- |
後置デクリメント | y = x--; |
y に x を代入したあと x を 1 減らす |
ファイル名:08-5_increment_example.c
#include <stdio.h>
int main(void) {
int x = 5;
int y;
y = ++x;
printf("前置インクリメント: x = %d, y = %d\n", x, y); // x=6, y=6
x = 5;
y = x++;
printf("後置インクリメント: x = %d, y = %d\n", x, y); // x=6, y=5
x = 5;
y = --x;
printf("前置デクリメント: x = %d, y = %d\n", x, y); // x=4, y=4
x = 5;
y = x--;
printf("後置デクリメント: x = %d, y = %d\n", x, y); // x=4, y=5
return 0;
}
前置インクリメント: x = 6, y = 6
後置インクリメント: x = 6, y = 5
前置デクリメント: x = 4, y = 4
後置デクリメント: x = 4, y = 5
このように、式の評価タイミングによって結果が変わるため、使い分けに注意しましょう。
| 演算子 | 意味 | 使用例 | 説明 |
|---|---|---|---|
++ |
インクリメント | ++x |
変数の値を1増やす |
-- |
デクリメント | --x |
変数の値を1減らす |
++x は「1増やしてから使用する」x++ は「使用したあとに1増える」演算子には計算の優先順位があり、以下の順で評価されます:
()++ -- !* / %+ -< <= > >=== !=&&||?:= += -= *= /=例:
int x = 3 + 2 * 4; // 結果は11(先に掛け算)
int y = (3 + 2) * 4; // 結果は20(括弧で明示)
| 演算子 | 意味 | 例 | 結果(真は1、偽は0) |
|---|---|---|---|
== |
等しい | x == 5 |
1(xが5なら) |
!= |
等しくない | x != 0 |
1(xが0以外なら) |
> |
より大きい | x > 10 |
1(xが10より大きい) |
< |
より小さい | x < 3 |
1(xが3未満) |
>= |
以上 | x >= 70 |
1(70以上) |
<= |
以下 | x <= 100 |
1(100以下) |
🔸 C言語では「偽=0、真=0以外の値」として評価されます。比較演算や論理演算の結果として返される値が 0 であれば「偽」、0 以外であれば「真」と見なされます。
たとえば以下のように、数値そのものを条件式に使うこともできます:
if (x) {
// x が 0 以外であれば実行される
}
より詳しい内容は if 文の解説で取り上げます。ここでは「0 が偽、それ以外が真」と判断されるという点だけ覚えておきましょう。
| 演算子 | 意味 | 使用例 | 結果 | |||
|---|---|---|---|---|---|---|
&& |
AND(かつ) | x > 0 && x < 10 |
両方満たせば真 | |||
| `| | ` | OR(または) | `x < 0 | x > 100` | どちらか満たせば真 | |
! |
NOT(否定) | !(x == 0) |
条件の反転 |
論理演算子 && や || を使うとき、必要に応じて後半の評価が省略されることがあります。これを短絡評価(ショートサーキット)と呼びます。
if (x != 0 && 10 / x > 1) {
// xが0でなければ除算が実行される
}
上記では x != 0 が偽なら 10 / x は評価されません。
→ 0除算を防ぐ安全な書き方が可能になります。
以下のプログラムを完成させ、正しい計算結果を出力しなさい。
int a = 4;
a *= 2;
a -= 1;
printf("a = %d\n", a);
正解と解説
a = 4 * 2 = 8
a = 8 - 1 = 7
出力:a = 7
以下の出力はどうなる?
int x = 5;
int y = x++;
printf("x = %d, y = %d\n", x, y);
正解と解説
後置インクリメントなので、yに代入した後でxが増える → x = 6, y = 5
以下のコードは安全な記述になっているか?理由も述べよ。
if (x != 0 && 100 / x > 1) {
printf("OK\n");
}
正解と解説
x != 0 が偽のとき、100 / x は評価されない。よって0除算を防げており、安全な書き方である。