C言語のプログラミングは、変数や値に対して様々な「操作」を行うことで成り立っています。その操作を指示するための記号が**「演算子」**です。
+
や-
といった算術演算子はもちろん、C言語には条件分岐や高度なデータ操作を可能にするための豊富な演算子が用意されています。この記事では、C言語の主要な演算子を種類ごとに分かりやすく解説します。
比較演算子 〜 2つの値を比べる
比較演算子は、2つの値の関係(等しい、大きい、小さいなど)を比較し、その結果を「真(正しい)」または「偽(間違い)」で返します。if
文などの条件式で中心的な役割を果たします。
演算子 | 意味 | 使用例 |
== | 等しい | if (a == 10) |
!= | 等しくない | if (a != 0) |
> | より大きい | if (a > b) |
< | より小さい | if (a < 100) |
>= | 以上 | if (a >= 20) |
<= | 以下 | if (a <= 50) |
注意: 「等しい」は =
ではなく ==
と2つ重ねます。=
1つは「代入」を意味するため、間違えるとバグの原因になります。
論理演算子 〜 複数の条件を組み合わせる
論理演算子は、「AかつB」や「AまたはB」のように、複数の比較結果を組み合わせて、より複雑な条件を作るために使います。
&&
(AND): 「かつ」を意味します。左右の条件が両方とも真の場合に、全体が真になります。C// scoreが80点以上、かつ、出席率が90%以上 if ((score >= 80) && (attendance >= 0.9)) { ... }
||
(OR): 「または」を意味します。左右の条件のどちらか一方でも真の場合に、全体が真になります。C// 休日、または、午前中 if ((is_holiday == 1) || (is_morning == 1)) { ... }
!
(NOT): 条件の真偽を反転させます。C// is_errorが真ではない(エラーがない)場合 if (!is_error) { ... }
ビット演算子 〜 コンピュータの気持ちになる
ビット演算子は、数値を0と1のビット列として扱い、ビット単位で直接操作を行うための、やや高度な演算子です。ハードウェアの制御や、メモリ効率を極限まで高めたい場合などに使われます。
演算子 | 意味 |
& | ビット単位のAND |
` | ` |
^ | ビット単位のXOR(排他的論理和) |
~ | ビット単位のNOT(ビット反転) |
<< | 左ビットシフト |
>> | 右ビットシフト |
Google スプレッドシートにエクスポート
これらに対応する複合代入演算子 (&=
, |=
, ^=
, <<=
, >>=
) もあります。
その他の重要な演算子
C言語には、他にも特定の目的で使われる重要な演算子がたくさんあります。
条件演算子 (? :
)
if-else
文を一行で簡潔に書くための演算子です。三項演算子とも呼ばれます。
条件式 ? 真の場合の値 : 偽の場合の値
// a と b のうち、大きい方の値をmaxに代入する
int max = (a > b) ? a : b;
ポインタ関連の演算子 (&
, *
)
&
(アドレス演算子): 変数がメモリ上のどこにあるか、というアドレスを取得します。scanf
で変数のアドレスを渡す際によく使われます。*
(間接参照演算子): ポインタ変数が指し示しているアドレスに格納されている値を取得します。
sizeof
演算子
変数やデータ型が、メモリ上で何バイトのサイズを占めているかを調べます。
printf("int型のサイズ: %zu バイト\n", sizeof(int));
// %zu は sizeof の結果を表示するための正しい書式指定子
キャスト演算子
あるデータ型の値を、一時的に別の型として扱いたい場合に使う「型変換」の演算子です。
int i = 5;
double d;
// int型の i を double型にキャストしてから、2.0で割る
d = (double)i / 2.0; // d は 2.5 になる
演算子の優先順位
1 + 2 * 3
という式では、掛け算が先に計算されるように、C言語の演算子にも実行される優先順位があります。
優先順位は複雑で、すべてを暗記するのは大変です。そこで、重要なルールがあります。
「優先順位に迷ったら、括弧 ()
を使え!」
括弧で囲んだ部分は、他のどの演算子よりも優先的に計算されます。括弧を使うことで、計算の順序をプログラマが明示的に制御できるだけでなく、コードを読む人にとっても意図が分かりやすくなるという大きなメリットがあります。