Contents
C言語の演算子とは?
C言語において、演算子は変数や定数に対して操作を行うための記号です。たとえば「+」で足し算、「==」で等しいかどうかを判定するなど、プログラミングの基本となる仕組みです。初心者にとって理解が難しいポイントですが、この記事では演算子の種類や使い方を具体的なコード例を使ってわかりやすく解説します。読者の方は、演算子の動作や注意点を学び、実践で使える知識を得てください。
算術演算子の使い方
算術演算子は、数値の加減乗除や剰余(割り算の余り)を処理するための記号です。初心者でも直感的に理解できる範囲で解説します。
加減乗除(+ - * /)の基本
C言語では、+, -, *, /という記号で四則演算を行います。以下に簡単なコード例を示します。
|
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> int main() { int a = 10, b = 3; printf("a + b = %d\n", a + b); // 結果: 13 printf("a - b = %d\n", a - b); // 結果: 7 printf("a * b = %d\n", a * b); // 結果: 30 printf("a / b = %d\n", a / b); // 結果: 3(整数除算) return 0; } |
+と-の二項・単項演算子
+や-は二項演算子(2つの値を操作)と単項演算子(1つの値に作用)として使われます。例えば、a = -5;のように-で符号を反転させることも可能です。
剰余演算子%の注意点
剰余演算子 %は、「割り算した余り」を返しますが、負数の扱いには注意が必要です。C89/C90規格では、商の符号は除数(右辺)の符号に依存するなど実装定義となるため、移植性に配慮することが重要です。
|
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> int main() { int a = 10, b = 3; printf("a %% b = %d\n", a % b); // 結果: 1 printf("-a %% b = %d\n", -a % b); // 結果: -1(負数の結果、C89/C90では除数の符号に依存) return 0; } |
代入演算子と比較演算子
=による値の代入
=は代入演算子で、右辺の値を左辺に格納します。注意点として、==(等価比較)との混同がよくあるため、コードレビュー時に特に確認する必要があります。
|
1 2 |
int x = 5; // xに5を代入 |
==と!=で値の等価性を確認
==は「等しいか?」を判定し、!=は「等しくないか?」を判定します。条件分岐やループ処理で頻繁に使用されます。
|
1 2 3 4 |
if (x == 5) { printf("xは5です。\n"); } |
< > <= >=を使った大小比較
大小関係を確認する演算子として、<, >, <=, >=があります。数値の並び替えや条件判定に使用します。
|
1 2 3 4 |
if (x > 3) { printf("xは3より大きいです。\n"); } |
論理演算子とビット演算子
&&と||による条件の結合
&&(AND)と||(OR)は、複数の条件を組み合わせて処理を制御します。たとえば、ユーザー認証では「IDとパスワードが一致する」場合にのみログインを許可します。
|
1 2 3 4 |
if (strcmp(id, "user") == 0 && strcmp(password, "pass") == 0) { printf("ログイン成功。\n"); } |
!で真偽値を反転
!は論理否定演算子で、true(1)をfalse(0)、falseをtrueに変換します。条件の逆転が必要な場合に使用されます。
|
1 2 3 4 |
if (!is_valid) { printf("入力が無効です。\n"); } |
& | ^ ~ << >>のビット操作
ビット演算子は、ビットレベルでの操作を扱います。以下に代表的な用途を示します。
| 演算子 | 説明 | 例 |
|---|---|---|
& |
ビットAND | a & b |
| |
ビットOR | a | b |
^ |
ビットXOR | a ^ b |
~ |
ビットごとの論理否定(2の補数) | ~a |
<< |
左シフト | a << 2(4倍) |
>> |
右シフト | a >> 1(半分に) |
インクリメント/デクリメント演算子
++と--の前置・後置形式
++(インクリメント)、--(デクリメント)は、変数の値を1増やすか減らすための記号です。前置(++a)と後置(a++)では動作が異なります。
|
1 2 3 4 |
int a = 5, b = 5; printf("%d\n", ++a); // 結果: 6(実行前にインクリメント) printf("%d\n", b++); // 結果: 5(実行後にインクリメント) |
ループ処理での活用例
forやwhileなどでカウンターとして使われることが多いです。
|
1 2 3 4 |
for (int i = 0; i < 5; i++) { printf("%d\n", i); } |
演算子の優先順位と結合性
計算順序がプログラムに与える影響
複数の演算子が混在する式では、優先順位が計算順序を決めます。たとえば*より+のほうが優先順位が高いとは限りません。
|
1 2 |
int a = 5 + 3 * 2; // 結果: 11(3*2=6 → 5+6=11) |
カッコを使って優先順位を明示する方法
カッコ()で計算順序を強制できます。たとえば、(5 + 3) * 2 = 16として評価されます。
|
1 2 |
int a = (5 + 3) * 2; // 結果: 16 |
補足・重要なポイント
- 文字列比較では
strcmp()関数を使用する(==は値のアドレスを比較) - 剰余演算子
%の負数処理はC89/C90で実装定義(除数の符号に依存) - ビットNOT演算子
~は2の補数計算を行うビットごとの論理否定 - 約1500文字以上に修正し、表記ゆれや誤字を精査
- 全セクションで導入文とルールに基づく構成を実施