
四則演算についてはC言語でなくても、算数と同じなのでわかると思いますが、
プログラムでのビット演算や論理演算などは2進数の勉強をしていないとわかりにくいと思います。
今ここで完全に理解できなくても、「こういうものがあるのか。。」ぐらいでも大丈夫です。
実際の仕事や勉強で出てきたときに、集中して理解に努めれば良いと思います。
それでは、C言語の演算子と優先順位について解説していきます。
1.演算子の種類
演算子の種類としては、
があります。
各々について説明していきます。
1.1. 算術演算子
使用例など下表になります。
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| + | 加算 | a = b + c | bとcを足し算した値をaに入れる。 |
| - | 減算 | a = b - c | bからcを引き算した値をaに入れる。 |
| * | 乗算 | a = b * c | bとcを掛け算した値をaに入れる。 |
| / | 徐算 | a = b / c | bをcで割り算した値をaに入れる。 |
| % | 余り | a = b % c | bをcで割り算した余りをaに入れる。 |
これらの演算子を使わないソフトウェアはおそらくありません。 それぐらい使います。
1.2. インクリメント演算子
インクリメントやデクリメントは、変数に1足したり、1引いたりしますが、
演算子を変数の後ろにつけるか前につけるかで動きが変わります。
使用例などを下表にまとめました。
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| ++ | インクリメント |
a = b++; a = ++b; |
bをaに入れた後に、bをインクリメントする。 bをインクリメントして、aに入れる。 |
| -- | デクリメント |
a = b--; a = --b; |
bをaに入れた後に、bをデクリメントする。 bをデクリメントして、aに入れる。 |
while文やfor文でのループの回数を数えるときに良く使用しますが、
ループ条件で、前に付けるか後ろに付けるか、やりやすい方を使用すると良いです。
1.3. 比較演算子
比較演算子は、条件分岐構文の if/else文でよく使用します。
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
|
< > |
大小比較 (比較対象の値は含まない) |
a < 8 a > 8 |
aが7以下なら真、8以上なら偽。 aが9以上なら真、8以下なら偽。 |
|
<= >= |
大小比較 (比較対象の値は含む) |
a <= 8 a >= 8 |
aが8以下なら真、9以上なら偽。 aが8以上なら真、7以下なら偽。 |
| == | 等値比較 | a == 8 |
aが8なら真、8以外なら偽。 |
| != | 不等値比較 | a != 8 | aが8以外なら真、8なら偽。 |
1.4. 論理演算子
論理演算子も、条件分岐構文の if/else文でよく使用します。
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| && | 論理積 | 5 <= a && a <= 10 | aが5以上かつ10以下なら真、それ以外は偽。 |
| || | 論理和 | b <= 5 || b >= 10 | bが5以下もしくは10以上なら真、それ以外は偽。 |
1.5. ビット演算子
ビットシフトの演算子は、デバイスドライバで使用することが多いです。
他は、数値計算や数学系のプログラムなどでよく使用されています。
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| & | ビット毎の論理積(AND) | a = b & 0xf0 | bと0xf0とのANDの結果をaに入れる。 |
| | | ビット毎の論理和(OR) | a = b | 0xf0 | bと0xf0とのORの結果をaに入れる。 |
| ^ | ビット毎の排他的論理和(XOR) | a = b ^ c | bとcとのXORの結果をaに入れる。 |
| ~ | ビット毎の反転(NOT) | a = ~b | bのNOTの結果をaに入れる。 |
| << | 左シフト | a = b << 8 | bを左に8ビットシフトした値をaに入れる。 |
| >> | 右シフト | a = b >> 8 | bを右に8ビットシフトした値をaに入れる。 |
1.6. 代入演算子
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| = | 右辺を左辺に代入。 | a = b | bの値をaに入れる。 |
| += | 右辺と左辺を足して左辺に入れる。 | a += b | bとaを足し算した結果をaに入れる。 |
| ー= | 右辺と左辺を引いて左辺に入れる。 | a -= b | bとaを引き算した結果をaに入れる。 |
| *= | 右辺と左辺を掛けて左辺に入れる。 | a *= b | bとaを掛け算した結果をaに入れる。 |
| /= | 右辺を左辺で割って左辺に入れる。 | a /= b | bをaで割り算した結果をaに入れる。 |
| %= | 右辺と左辺を割った余りを左辺に入れる。 | a %= b | bをaで割り算した余りをaに入れる。 |
| &= | 右辺と左辺とのANDの結果を左辺に入れる。 | a &= 0xf0 | aと0xf0とのANDの結果をaに入れる。 |
| |= | 右辺と左辺とのORの結果を左辺に入れる。 | a |= 0xf0 | aと0xf0とのORの結果をaに入れる。 |
| ^= | 右辺と左辺とのXORの結果を左辺に入れる。 | a ^= b | bとaとのXORの結果をaに入れる。 |
| <<= | 左辺を左辺値分、左シフトして左辺に入れる。 | a <<= 8 | aを左に8ビットシフトした結果をaに入れる。 |
| >>= | 左辺を左辺値分、右シフトして左辺に入れる。 | a >>= 8 | aを右に8ビットシフトした結果をaに入れる。 |
これらの代入演算子は、直感的にわかりにくい感じがしますので、
例えば、「a = a + b」のような感じで、 まとめずに書くほうが、
他人がプログラムを読んだときにも、わかりやすいと思います。
1.7. 条項演算子
| 演算子 | 説明 | 使用例 | 使用例説明 |
|---|---|---|---|
| ?: | 加算 | a ? b : c | aが真ならb、aが偽ならc。 |
私は、今まで数多くのプログラムを見てきましたが、
条項演算子を使用したプログラムは、ほとんど見たことがありません。
この演算子はあまり使用せず、普通にif文で書く方が良いと思います。
2.演算子の優先順位
これまで説明した演算子には同時に使用された場合、
どちらを先に計算するかという優先順位があります。
その優先順位の順番は下表のとおりです。
| 優先順位 | 演算子 |
|---|---|
| 優先度高 | () [] -> . |
| ⇡ | ! ~ ++ -- (type) & |
| | | * / % |
| | | + - |
| | | << >> |
| | | < <= => > |
| | | == != |
| | | & |
| | | ^ |
| | | | |
| | | && |
| | | || |
| | | ? : |
| ⇣ | = += -= *= %= &= |= ^= <<= >>= |
| 優先度低 | , |
3.最後に
演算子は、プログラムを組んだり読んだりしていると、 いつのまにか覚えます。
なので、プログラムをひたすら読み書きをして慣れていきましょう。
<関連・おすすめ記事>
私がviエディタを好きになった理由とその使い方 - 水瓶座列車
C言語の始め方と基本構造、コンパイルから実行までを解説 - 水瓶座列車
C言語の繰り返し構文( while, do while, for )の解説と応用 - 水瓶座列車
プログラミングを独学で勉強するためのLinuxパソコン準備手順 - 水瓶座列車