C言語演算子完全ガイド:種類、機能、実例付き解説
演算子とは
演算子とは、コンパイラに特定の数学的または論理的機能を実行するよう指示する記号です。C言語は豊富な組み込み演算子を備え、以下のタイプの演算子を提供します:
- 算術演算子
- 関係演算子
- 論理演算子
- ビット演算子
- 代入演算子
- その他の演算子
この章では各演算子の働きを見ていきます。
算術演算子
以下の表はC言語がサポートするすべての算術演算子を示します。変数Aが10、変数Bが20を保持すると仮定:
| 演算子 | 説明 | 例 |
|---|---|---|
| + | 2つのオペランドを加算 | A + B = 30 |
| - | 第1オペランドから第2オペランドを減算 | A - B = -10 |
| * | 両オペランドを乗算 | A * B = 200 |
| / | 分子を分母で除算 | B / A = 2 |
| % | 剰余演算子、整数除算後の余り | B % A = 0 |
| ++ | インクリメント演算子、整数値を1増やす | A++ = 11 |
| -- | デクリメント演算子、整数値を1減らす | A-- = 9 |
関係演算子
以下の表はCがサポートするすべての関係演算子を示します。変数Aが10、変数Bが20を保持すると仮定:
| 演算子 | 説明 | 例 |
|---|---|---|
| == | 2つのオペランドの値が等しいかチェック。真なら条件は真 | (A == B) は真でない |
| != | 2つのオペランドの値が等しくないかチェック。真なら条件は真 | (A != B) は真 |
| > | 左オペランドの値が右オペランドより大きいかチェック。真なら条件は真 | (A > B) は真でない |
| < | 左オペランドの値が右オペランドより小さいかチェック。真なら条件は真 | (A < B) は真 |
| >= | 左オペランドが右オペランド以上かチェック。真なら条件は真 | (A >= B) は真でない |
| <= | 左オペランドが右オペランド以下かチェック。真なら条件は真 | (A <= B) は真 |
論理演算子
以下の表はC言語がサポートするすべての論理演算子を示します。変数Aが1、変数Bが0を保持すると仮定:
| 演算子 | 説明 | 例 |
|---|---|---|
| && | 論理AND演算子。両オペランドが非ゼロなら条件は真 | (A && B) は偽 |
| || | 論理OR演算子。いずれかのオペランドが非ゼロなら条件は真 | (A || B) は真 |
| ! | 論理NOT演算子。オペランドの論理状態を反転。真なら偽に | !(A && B) は真 |
ビット演算子
ビット演算子はビット単位で動作し、ビットごとの演算を行います。&、|、^の真理値表:
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
A = 60、B = 13と仮定すると、二進数では:
A = 0011 1100 B = 0000 1101 ----------------- A&B = 0000 1100 A|B = 0011 1101 A^B = 0011 0001 ~A = 1100 0011
Cがサポートするビット演算子:変数'A'が60、変数'B'が13を保持すると仮定:
| 演算子 | 説明 | 例 |
|---|---|---|
| & | バイナリAND演算子。ビットが両オペランドに存在する場合、結果にコピー | (A & B) = 12, つまり 0000 1100 |
| | | バイナリOR演算子。ビットがいずれかのオペランドに存在する場合、コピー | (A | B) = 61, つまり 0011 1101 |
| ^ | バイナリXOR演算子。ビットが一方のオペランドにのみセットされている場合、コピー | (A ^ B) = 49, つまり 0011 0001 |
| ~ | バイナリ1の補数演算子。単項でビットを「反転」させる効果 | (~A) = ~(60), つまり -0111101 |
| << | バイナリ左シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ左に移動 | A << 2 = 240, つまり 1111 0000 |
| >> | バイナリ右シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ右に移動 | A >> 2 = 15, つまり 0000 1111 |
代入演算子
C言語がサポートする代入演算子:
| 演算子 | 説明 | 例 |
|---|---|---|
| = | 単純代入演算子。右側オペランドの値を左側オペランドに代入 | C = A + B は A + B の値を C に代入 |
| += | 加算代入演算子。右オペランドを左オペランドに加え、結果を左オペランドに代入 | C += A は C = C + A と等価 |
| -= | 減算代入演算子。右オペランドを左オペランドから引き、結果を左オペランドに代入 | C -= A は C = C - A と等価 |
| *= | 乗算代入演算子。右オペランドを左オペランドに掛け、結果を左オペランドに代入 | C *= A は C = C * A と等価 |
| /= | 除算代入演算子。左オペランドを右オペランドで割り、結果を左オペランドに代入 | C /= A は C = C / A と等価 |
| %= | 剰余代入演算子。2つのオペランドで剰余を取り、結果を左オペランドに代入 | C %= A は C = C % A と等価 |
| <<= | 左シフト代入演算子 | C <<= 2 は C = C << 2 と同じ |
| >>= | 右シフト代入演算子 | C >>= 2 は C = C >> 2 と同じ |
| &= | ビット単位AND代入演算子 | C &= 2 は C = C & 2 と同じ |
| ^= | ビット単位排他的OR代入演算子 | C ^= 2 は C = C ^ 2 と同じ |
| |= | ビット単位包括的OR代入演算子 | C |= 2 は C = C | 2 と同じ |
その他の演算子:sizeof と 三項演算子
上記以外にも、sizeofと? :など、C言語がサポートする重要な演算子があります:
| 演算子 | 説明 | 例 |
|---|---|---|
| sizeof() | 変数のサイズを返す | sizeof(a)でaが整数なら4を返す |
| & | 変数のアドレスを返す | &a; 変数の実際のアドレスを返す |
| * | 変数へのポインタ | *a; |
| ? : | 条件式 | 条件が真 ? 値X : それ以外 値Y |
C言語における演算子の優先順位
演算子の優先順位は、式内の項のグループ化を決定し、式の評価方法を決めます。特定の演算子は他より高い優先順位を持ちます。例えば、乗算演算子は加算演算子より高い優先順位です。
例:x = 7 + 3 * 2; ここでxには20ではなく13が代入されます。演算子*が+より高い優先順位を持つため、まず3*2が計算され、その後7が加算されるからです。
ここでは、最も高い優先順位の演算子が表の上部に、最も低いものが下部に現れます。式の中で、優先順位の高い演算子が最初に評価されます。
| カテゴリ | 演算子 | 結合規則 |
|---|---|---|
| 後置 | () [] -> . ++ -- | 左から右 |
| 単項 | + - ! ~ ++ -- (type)* & sizeof | 右から左 |
| 乗算 | * / % | 左から右 |
| 加算 | + - | 左から右 |
| シフト | << >> | 左から右 |
| 関係 | < <= > >= | 左から右 |
| 等価 | == != | 左から右 |
| ビットAND | & | 左から右 |
| ビットXOR | ^ | 左から右 |
| ビットOR | | | 左から右 |
| 論理AND | && | 左から右 |
| 論理OR | || | 左から右 |
| 条件 | ?: | 右から左 |
| 代入 | = += -= *= /= %= >>= <<= &= ^= |= | 右から左 |
| カンマ | , | 左から右 |
C言語
- C#演算子完全ガイド:C#における演算子の包括的解説
- C# ビット演算子とビットシフト演算子をマスターする:包括的ガイド
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C言語演算子完全ガイド:算術・関係・論理・ビット演算子
- C 言語ビット演算子マスター: AND、OR、XOR、シフト、補数
- C++演算子完全ガイド:種類、使い方、ベストプラクティス
- Verilog演算子:合成に必須の算術・制御演算子
- MATLAB演算子完全ガイド:算術・論理・ビット演算・集合操作
- Python 演算子完全マスター: 包括的ガイド
- Java演算子をマスター:種類、構文、実践例
- Java演算子完全ガイド:算術/関係/ビット/論理/代入/三項/instanceof